舵机驱动程序
SG90
接线图
工作原理
转动方向与占空比有关
占空比大往右转
占空比小往左转
占空比0.5停止
程序
链接:https://pan.baidu.com/s/1F7BgWfz7RpCck3c_–Sirg
提取码:6d3a
信号线 F9
void TIM14_PWM_Init(u32 arr,u32 psc)
{
//此部分需手动修改IO口设置
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //TIM14时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能PORTF时钟
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9复用为定时器14
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //GPIOF9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化PF9
TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定时器14
//初始化TIM14 Channel1 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性低
TIM_OC1Init(TIM14, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM1 4OC1
TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); //使能TIM14在CCR1上的预装载寄存器
TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE使能
TIM_Cmd(TIM14, ENABLE); //使能TIM14
}
```c
TIM14_PWM_Init(200-1,8400-1);
arr=200 -1 psc=8400-1
在代码中要特别注意的是时基结构体的TIM_Period(自动重装载寄存器值,简称arr)和TIM_Prescaler(预分频寄存器值,简称psc),因为这两个决定了输出PWM信号的周期。具体的周期计算公式为:周期=(arr+1)*(psc+1)/CLK。其中CLK为计数器的时钟频率,我的是84MHZ,也就是84000000。最后计算结果单位为秒,结果为0.02s,也就是20ms。这样的配置就是为了让输出的PWM信号达到前面说到的舵机要求的20ms周期。
这段话引用CSDN博主「_pray」的原创文章
原文链接:https://blog.csdn.net/qq_40499719/article/details/81267895
核心
key=KEY_Scan(0); //得到键值
if(key)
{
switch(key)
{
case WKUP_PRES: //控制蜂鸣器
TIM_SetCompare1(TIM14,5);
delay_ms(40);**这个时间可以控制转过的角度**
//TIM_SetCompare1(TIM14,15);
break;
case KEY0_PRES: //控制LED0翻转
TIM_SetCompare1(TIM14,10);
delay_ms(40);
break;
case KEY1_PRES: //控制LED1翻转
TIM_SetCompare1(TIM14,20);
delay_ms(20);
break;
case KEY2_PRES: //同时控制LED0,LED1翻转
TIM_SetCompare1(TIM14,25);
delay_ms(20);
// LED1=!LED1;
break;
}
case WKUP_PRES: //控制蜂鸣器
TIM_SetCompare1(TIM14,5);
delay_ms(40);
** delay_ms(40)这个时间可以控制转过的角度**
例如当 TIM_SetCompare1(TIM14,10);时转动角度为45°
因为周期是20ms ,所以当delay_ms(40)时相当于执行两个周期
也就是转过了两个45°
时间长度可由自己控制
达到了按照一定角度转动之后能够停下来的目的
如果有写的不对的地方欢迎大家批评指正,共同进步!!!