当前位置:   article > 正文

stm32使用定时器给任意引脚输出舵机驱动信号_怎么用定时器的复用引脚驱动舵机

怎么用定时器的复用引脚驱动舵机

头文件

  1. #ifndef __tim6_H
  2. #define __tim6_H
  3. #include "sys.h"
  4. #define TIM6_PWM_T 50
  5. //LED端口定义
  6. #define T_PORT1 PBout(12) // DS0
  7. #define T_PORT2 PBout(13) // DS1
  8. void TIM6_Pwm_Init(void);
  9. void Servo_Set_Angle(u8 channel , float angle);
  10. #endif

定时器代码:

  1. #include "tim6.h"
  2. /*
  3. 普通定时器中断功能生成舵机驱动波形
  4. */
  5. void Servo_Gpio_Init(){
  6. GPIO_InitTypeDef GPIO_InitStructure;
  7. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOF时钟
  8. //GPIOF9,F10初始化设置
  9. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;
  10. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  11. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  12. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  13. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  14. GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
  15. }
  16. void TIM6_Pwm_Init()
  17. {
  18. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  19. NVIC_InitTypeDef NVIC_InitStructure;
  20. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE); ///使能TIM7时钟
  21. TIM_TimeBaseInitStructure.TIM_Period = TIM6_PWM_T-1; //自动重装载值
  22. TIM_TimeBaseInitStructure.TIM_Prescaler=84-1; //定时器分频
  23. TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
  24. TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  25. TIM_TimeBaseInit(TIM6,&TIM_TimeBaseInitStructure);//初始化TIM7
  26. TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); //允许定时器7更新中断
  27. TIM_Cmd(TIM6,ENABLE); //使能定时器3
  28. NVIC_InitStructure.NVIC_IRQChannel=TIM6_DAC_IRQn; //定时器3中断
  29. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00; //抢占优先级1
  30. NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x04; //子优先级3
  31. NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  32. NVIC_Init(&NVIC_InitStructure);
  33. Servo_Gpio_Init();
  34. }
  35. u8 time6_duty1 = 15;
  36. u8 time6_duty2 = 10000/TIM6_PWM_T;
  37. /*
  38. 理论上可以给任意引脚输出pwm舵机控制信号,此地pwm频率固定为50HZ
  39. */
  40. void TIM6_DAC_IRQHandler(void)
  41. {
  42. static u16 i=0;
  43. if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)
  44. {
  45. // 在这里添加你的代码逻辑
  46. i++;
  47. if(i<=time6_duty1) T_PORT1=1;
  48. else T_PORT1=0;
  49. if(i<=time6_duty2) T_PORT2=1;
  50. else T_PORT2=0;
  51. if(i==20000/TIM6_PWM_T) i=0;
  52. TIM_ClearITPendingBit(TIM6, TIM_IT_Update); // 清除中断标志位
  53. }
  54. }
  55. /*
  56. 函数功能:引脚输出舵机控制信号
  57. 参数: channel->通道 angle->角度
  58. 返回值:无
  59. */
  60. void Servo_Set_Angle(u8 channel , float angle){
  61. angle = 1500/TIM6_PWM_T+1000/TIM6_PWM_T/90.0*angle;
  62. if(channel==0){
  63. time6_duty1 = angle;
  64. }
  65. if(channel==1){
  66. time6_duty2 = angle;
  67. }
  68. }

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

闽ICP备14008679号