繁体   English   中英

如何在带有定时器的STM32F103上为控制伺服电机生成PWM

[英]How to Generate PWM for control servo motor on STM32F103 with Timer

如何使用计时器C代码在STM32F103上为控制伺服电机生成PWM我想要通过PWM控制伺服电机我从ADC获取值然后计算得出PWM占空比

流程图获取VR的值-> ADC模块(将模数转换为数字)->计算PWM占空比->使用定时器为控制伺服电机生成PWM-> while循环

对不起我的英语。

该代码假定APB1时钟= 72MHz Servo_Target为八分之一微秒,因此4000表示1ms(低伺服位置),而8000表示2ms(高伺服位置)警告:PWM频率为463Hz,因此您不能将此设置用于模拟伺服。 它适用于无刷调节器。 如果要使用模拟伺服,则必须更改TIM_Prescaler,TIM_Period并考虑对Servo_Target值的影响

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode   = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period        = 8192;                       
TIM_TimeBaseStructure.TIM_Prescaler     = 18;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_Cmd(TIM2, ENABLE);  // Start PWM Timer
TIM_OCInitStructure.TIM_OCMode      = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity  = TIM_OCPolarity_High;

// THIS IS THE WIDTH in 1/8 us
TIM_OCInitStructure.TIM_Pulse       = Servo_Target;     

/* PWM1 Mode configuration: TIM2 Channel1 */
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);

/* PWM1 Mode configuration: TIM2 Channel2 */
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);

// add OC3_ and OC4_ for 3rd and 4th channels    
TIM_ARRPreloadConfig(TIM2, ENABLE);

我假设您正在使用IDE并用C编写,但是我对该设备不熟悉。

基本上,您需要使用设备上有多个定时器,并为“输出比较”中断编写中断处理程序。 如果启用了输出比较中断,则每次计时器中的值与某个寄存器中的值匹配时,就会调用您的处理程序。

一种常见的技术是使处理程序将引脚切换到伺服,然后更改输出比较寄存器中的值,以使处理程序在下次需要时再次触发。

if(off)
   turn pin on
   ocreg += pwm_value
else
   turn pin off
   ocreg += cycle-pwm_value

该引脚将保持正确的时间长度,并始终以相同的频率导通。 您需要根据伺服规格为这些变量找到合适的值。

您可以使用另一个计时器定期采样ADC,或者将其内置到与PWM相同的中断处理程序中,甚至可以让它在繁忙的循环中运行以等待ADC完成。

main()
  loop
    start ADC
    while (ADC busy) { do nothing }
    calculate pwm and store in variable pwm_value
    loop

视伺服规格而定,您可能必须稍作修改以防止周期漂移,但是伺服通常是相当宽容的。

您需要找到适用于您的编译器的中断处理程序语法的示例,并始终阅读有关如何使用寄存器来控制计时器和启用中断的手册。

祝您好运,完成更多工作后,请发布带有一些代码的新问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM