当前位置:   article > 正文

基于STM32F103C8T6的循迹避障小车完整制作过程(详细)----下篇(第789点)_c8t6小车超声波避障代码

c8t6小车超声波避障代码

接中篇

基于STM32F103C8T6的循迹避障小车完整制作过程(详细)----中篇(第456点)

上篇主要是讲一些基础的东西,中篇讲了如何制作循迹,本篇讲一下制作避障小车。

七,如何用使用pwm让舵机旋转到相应的角度

这位博主讲的很详细:
stm32 智能避障小车(二)之sg90
我对他其中的一些关键信息再说明一下:
1,接线
橙色信号线  
红色正极 
棕褐色负极
2,舵机控制对pwm的要求
舵机的控制需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分:
t = 0.5ms——————-舵机会转动 0 °
t = 1.0ms——————-舵机会转动 45°
t = 1.5ms——————-舵机会转动 90°
t = 2.0ms——————-舵机会转动 135°
t = 2.5ms——————-舵机会转动180°

我设置的是在转90度的时候为舵机的正前方,这样就能让舵机左右转了。
好了,经过上面的分析我们可以开始写程序了,思路如下:
利用定时器输出一个占空比可调的pwm,且这个pwm的周期为20ms。

下面看一下我的sg90.c文件:

#include "sg90.h"

void SG90_pwm_init(void)
{
   
	GPIO_InitTypeDef GPIO_InitStructure;   
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure;
	
	/* 开启时钟 */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

	/*  配置GPIO的模式和IO口 */
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;// PA1
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	//TIM3定时器初始化
	TIM_TimeBaseInitStructure.TIM_Period = 199; //PWM 频率=72000/(199+1)=36Khz//设置自动重装载寄存器周期的值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 7199;//设置用来作为TIMx时钟频率预分频值
	TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;	//TIM向上计数模式
	TIM_TimeBaseInit(TIM2, & TIM_TimeBaseInitStructure);


	//PWM初始化	  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM输出使能
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;

	TIM_OC2Init(TIM2,&TIM_OCInitStructure);
	//注意此处初始化时TIM_OC1Init而不是TIM_OCInit,否则会出错。因为固件库的版本不一样。
	TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能或者失能TIMx在CCR1上的预装载寄存器
	TIM_Cmd(TIM2,ENABLE);//使能或者失能TIMx外设
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

下面是sg90.h文件内容:

#ifndef __SG90_H
#define	__SG90_H

#include "stm32f10x.h"
#include "delay.h"
   
#define   SG90_Right_90     TIM_SetCompare2(TIM2, 195)		//右转90度
#define   SG90_Right_45		TIM_SetCompare2(TIM2, 190)		
#define   SG90_Front		TIM_SetCompare2(TIM2, 185)		//舵机摆正
#define   SG90_Left_45		TIM_SetCompare2(TIM2, 180)		//左转45度
#define   SG90_Left_90		TIM_SetCompare2(TIM2, 175)
		
void SG90_pwm_init(void);  //舵机pwm初始化

#endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

我来解释一下舵机代码比较关键的几个参数设置:
1,引脚怎么接?
PA1接舵机橙色线。
2,设置周期为20ms
TIM_TimeBaseInitStructure.TIM_Period = 199;
TIM_TimeBaseInitStructure.TIM_Prescaler = 7199;
通过这两句话,根据周期计算公式:
PW

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/918177
推荐阅读
相关标签
  

闽ICP备14008679号