你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f103c8t6利用蓝牙控制180度舵机

[复制链接]
STMCU小助手 发布时间:2022-10-16 18:04
stm32f103c8t6利用蓝牙控制180度舵机

关于蓝牙模块部分,如果不了解蓝牙模块的可以看我之前发的东西。
一般来说,舵机接收的PWM信号频率为50HZ,即周期为20ms。当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。以180度角度舵机为例,那么对应的控制关系是这样的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;


20201129230300997.png


关于舵机的话,本人用的是6~8.4V的的60KG大舵机,这里需要注意的是, 控制板上面只提供5V电压,满足不了这种舵机的电压,所以我利用12V的锂电池,让锂电池的正负极接在降压模块输入端的正负极,接着让降压模块输出端的正负极接舵机的正负极,也就是说舵机是独立供电的,最重要的一点就是舵机外接电源的GND需要和控制板的GND接在一起,也就是共地,这样舵机才能转动,否则是转动不了的,如果你用的是5V的舵机,虽然大多数情况直接接控制板的正负极可以让舵机转动,但是这样电压不稳定,会导致舵机转动一个角度后就卡死了,所以本人建议舵机最好都给他个独立的电源,这样舵机就能连续转动,不会产生卡死状态。以下是本人所用的降压模块和60K大舵机的图片及视频效果,这种大舵机速度比较慢,但是扭矩大。
以下的舵机VCC->降压模块的VCC
舵机的GND->降压模块的GND
舵机的信号线->stm32控制板的PB5(TIM3_CH2)

20201129232421361.jpg



下面附上主程序:

  1. <font face="Tahoma"><font size="3"><font color="#000000">#include "led.h"</font></font></font>
  2. <font face="Tahoma"><font size="3"><font color="#000000">#include "delay.h"</font></font></font>
  3. <font face="Tahoma"><font size="3"><font color="#000000">#include "key.h"</font></font></font>
  4. <font face="Tahoma"><font size="3"><font color="#000000">#include "sys.h"</font></font></font>
  5. <font face="Tahoma"><font size="3"><font color="#000000">#include "usart.h"</font></font></font>
  6. <font face="Tahoma"><font size="3"><font color="#000000">#include "timer.h"</font></font></font>
  7. <font face="Tahoma"><font size="3"><font color="#000000"> </font></font></font>
  8. <font face="Tahoma"><font size="3"><font color="#000000">
  9. </font></font></font>
  10. <font face="Tahoma"><font size="3"><font color="#000000">extern u8 res;        </font></font></font>
  11. <font face="Tahoma"><font size="3"><font color="#000000">        </font></font></font>
  12. <font face="Tahoma"><font size="3"><font color="#000000"> int main(void)</font></font></font>
  13. <font face="Tahoma"><font size="3"><font color="#000000"> {                </font></font></font>
  14. <font face="Tahoma"><font size="3"><font color="#000000">         int len;</font></font></font>
  15. <font face="Tahoma"><font size="3"><font color="#000000">         int t;</font></font></font>
  16. <font face="Tahoma"><font size="3"><font color="#000000">int i;         </font></font></font>
  17. <font face="Tahoma"><font size="3"><font color="#000000">        delay_init();                     //延时函数初始化          </font></font></font>
  18. <font face="Tahoma"><font size="3"><font color="#000000">        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级</font></font></font>
  19. <font face="Tahoma"><font size="3"><font color="#000000">        uart_init(115200);         //串口初始化为115200</font></font></font>
  20. <font face="Tahoma"><font size="3"><font color="#000000">        My_USART2_Init();</font></font></font>
  21. <font face="Tahoma"><font size="3"><font color="#000000">         TIM1_PWM_Init(199,7199);         //不分频。T为20ms,这样的配置就是为了让输出的PWM信号达到舵机要求的20ms周期。</font></font></font>
  22. <font face="Tahoma"><font size="3"><font color="#000000">           while(1)</font></font></font>
  23. <font face="Tahoma"><font size="3"><font color="#000000">        {</font></font></font>
  24. <font face="Tahoma"><font size="3"><font color="#000000">                        if(res=='1'){TIM_SetCompare2(TIM3,175);delay_ms(1000);}对应180度</font></font></font>
  25. <font face="Tahoma"><font size="3"><font color="#000000">                        if(res=='2'){TIM_SetCompare2(TIM3,180);delay_ms(1000);}对应135度</font></font></font>
  26. <font face="Tahoma"><font size="3"><font color="#000000">                        if(res=='3'){TIM_SetCompare2(TIM3,185);delay_ms(1000);}对应90度</font></font></font>
  27. <font face="Tahoma"><font size="3"><font color="#000000">                        if(res=='4'){TIM_SetCompare2(TIM3,190);delay_ms(1000);}对应45度</font></font></font>
  28. <font face="Tahoma"><font size="3"><font color="#000000">                        if(res=='5'){TIM_SetCompare2(TIM3,195);delay_ms(1000);}对应0度</font></font></font>
  29. <font face="Tahoma"><font size="3"><font color="#000000">                //在周期20ms的PWM信号中,不同的脉宽对应舵机不同的转动角度,在0.5ms-2.5ms间有效                                                                                  </font></font></font>
  30. <font face="Tahoma"><font size="3"><font color="#000000">                //        TIM_SetCompare2(TIM4,175);//总共计数200,前面设置的模式是计数在比较值之后才是高电平</font></font></font>
  31. <font face="Tahoma"><font size="3"><font color="#000000">                //也就是高电平的时间是[(200-175)/200]*20ms=2.5ms,即转过360度,180度舵机依次类推                                </font></font></font>
  32. <font face="Tahoma"><font size="3"><font color="#000000">        }         </font></font></font>
  33. <font face="Tahoma"><font size="3"><font color="#000000"> }</font></font></font>
复制代码

子程序:
  1. <font face="Tahoma"><font size="3"><font color="#000000">#include "timer.h"</font></font></font>
  2. <font face="Tahoma"><font size="3"><font color="#000000">#include "led.h"</font></font></font>
  3. <font face="Tahoma"><font size="3"><font color="#000000">#include "usart.h"</font></font></font>
  4. <font face="Tahoma"><font size="3"><font color="#000000">void TIM1_PWM_Init(u16 arr,u16 psc)</font></font></font>
  5. <font face="Tahoma"><font size="3"><font color="#000000">{  </font></font></font>
  6. <font face="Tahoma"><font size="3"><font color="#000000">        GPIO_InitTypeDef GPIO_InitStructure;</font></font></font>
  7. <font face="Tahoma"><font size="3"><font color="#000000">        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;</font></font></font>
  8. <font face="Tahoma"><font size="3"><font color="#000000">        TIM_OCInitTypeDef  TIM_OCInitStructure;</font></font></font>
  9. <font face="Tahoma"><font size="3"><font color="#000000">        </font></font></font>
  10. <font face="Tahoma"><font size="3"><font color="#000000">         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO , ENABLE);  </font></font></font>
  11. <font face="Tahoma"><font size="3"><font color="#000000">        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);</font></font></font>
  12. <font face="Tahoma"><font size="3"><font color="#000000">        </font></font></font>
  13. <font face="Tahoma"><font size="3"><font color="#000000">        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); </font></font></font>
  14. <font face="Tahoma"><font size="3"><font color="#000000"> </font></font></font>
  15. <font face="Tahoma"><font size="3"><font color="#000000">   //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形        GPIOA.8</font></font></font>
  16. <font face="Tahoma"><font size="3"><font color="#000000">        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH1</font></font></font>
  17. <font face="Tahoma"><font size="3"><font color="#000000">        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出</font></font></font>
  18. <font face="Tahoma"><font size="3"><font color="#000000">        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;</font></font></font>
  19. <font face="Tahoma"><font size="3"><font color="#000000">        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO</font></font></font>
  20. <font face="Tahoma"><font size="3"><font color="#000000"> </font></font></font>
  21. <font face="Tahoma"><font size="3"><font color="#000000">   //初始化TIM1</font></font></font>
  22. <font face="Tahoma"><font size="3"><font color="#000000">        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值</font></font></font>
  23. <font face="Tahoma"><font size="3"><font color="#000000">        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 </font></font></font>
  24. <font face="Tahoma"><font size="3"><font color="#000000">        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim</font></font></font>
  25. <font face="Tahoma"><font size="3"><font color="#000000">        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式</font></font></font>
  26. <font face="Tahoma"><font size="3"><font color="#000000">//        TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//重复计数器的值</font></font></font>
  27. <font face="Tahoma"><font size="3"><font color="#000000">        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位</font></font></font>
  28. <font face="Tahoma"><font size="3"><font color="#000000">        </font></font></font>
  29. <font face="Tahoma"><font size="3"><font color="#000000">        //初始化TIM1 Channel1 PWM模式         </font></font></font>
  30. <font face="Tahoma"><font size="3"><font color="#000000">        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2</font></font></font>
  31. <font face="Tahoma"><font size="3"><font color="#000000">         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能</font></font></font>
  32. <font face="Tahoma"><font size="3"><font color="#000000">        //TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;</font></font></font>
  33. <font face="Tahoma"><font size="3"><font color="#000000">        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高</font></font></font>
  34. <font face="Tahoma"><font size="3"><font color="#000000">        //TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;//输出通道空闲电平极性设置</font></font></font>
  35. <font face="Tahoma"><font size="3"><font color="#000000">        TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2</font></font></font>
  36. <font face="Tahoma"><font size="3"><font color="#000000">//TIM_OC4Init(TIM1, &TIM_OCInitStructure);</font></font></font>
  37. <font face="Tahoma"><font size="3"><font color="#000000">
  38. </font></font></font>
  39. <font face="Tahoma"><font size="3"><font color="#000000">        TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM1在CCR1上的预装载寄存器</font></font></font>
  40. <font face="Tahoma"><font size="3"><font color="#000000">// TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); </font></font></font>
  41. <font face="Tahoma"><font size="3"><font color="#000000"> </font></font></font>
  42. <font face="Tahoma"><font size="3"><font color="#000000">        TIM_Cmd(TIM3, ENABLE);  //使能TIM1</font></font></font>
  43. <font face="Tahoma"><font size="3"><font color="#000000">        //TIM_CtrlPWMOutputs(TIM1, ENABLE);//主输出使能,当使用的通用定时器时,这句不需要</font></font></font>
  44. <font face="Tahoma"><font size="3"><font color="#000000">
  45. </font></font></font>
  46. <font face="Tahoma"><font size="3"><font color="#000000">}</font></font></font>
复制代码

如果在定时器初始化时TIM_OCInitStructure.TIM_OCMode配置的是PWM1模式那么main中的占空比就依次为25、20、15、10、5。下面解释一下模式PWM1和模式PWM2的区别:
假定TIM_OCInitTypeDef.TIM_OCPolarity = TIM_OCPolarity_High
若TIM_OCInitTypeDef.TIM_OCMode = TIM_OCMode_PWM1时:
当计时器值小于比较器设定值时则TIMX输出脚此时输出有效高电位。
当计时器值大于或等于比较器设定值时则TIMX输出脚此时输出低电位。
若TIM_OCInitTypeDef.TIM_OCMode = TIM_OCMode_PWM2时:
当计时器值小于比较器设定值时则TIMX输出脚此时输出有效低电位。
当计时器值大于或等于比较器设定值时则TIMX输出脚此时输出高电位。
本人用的是PWM2模式,在你们自己试验时,可以将占空比设置成各种不同的值,看看有什么不同的效果。
————————————————
版权声明:i土豆

收藏 评论0 发布时间:2022-10-16 18:04

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版