当前位置:首页>科技 >内容

stm32单片机步进电机的文章教程,stm32单片机教程实例-步进电机的速度控制

2023-11-06 22:28:02科技漂亮的斑马

很多朋友对stm32单片机步进电机的文章教程,stm32单片机教程实例-步进电机的速度控制不是很了解,六月小编刚好整理了这方面的知识,今天就

stm32单片机步进电机的文章教程,stm32单片机教程实例-步进电机的速度控制

很多朋友对stm32单片机步进电机的文章教程,stm32单片机教程实例-步进电机的速度控制不是很了解,六月小编刚好整理了这方面的知识,今天就来带大家一探究竟。

该项目需要制作一个使用全向轮的机器人底盘。对于全向轮,电机的精度是影响效果的重要因素。

因此,使用了步进电机。使用步进电机的好处是可以使用编码器,通过开环控制可以达到高精度的效果。

调整占空比还是调整周期众所周知,PWM有两个重要的参数,周期和占空比。步进电机的运动方式是每接收到一个脉冲就旋转一个指定的角度。

所以影响电机速度的唯一参数是PWM 的频率。下面两张图说明了调整占空比和调整周期的区别。

周期固定,占空比调整。上图中有4个PWM,周期相同。

不同之处在于它们的占空比为80% 至20%。可以看出,无论占空比是多少,1s内它们产生的高电平个数是相同的,即无论占空比是多少,PWM频率都是相同的。

因此,步进电机的速度无法调节。因为步进电机的速度只与PWM的频率有关。

占空比固定,调节周期有上图中的4个PWM。它们的占空比固定为50%,但它们有不同的周期。

可见即使占空比固定,只要动态调整周期,PWM也可以在同一时间内产生不同数量的脉冲。因此,可以通过固定占空比,动态调整PWM周期来达到控制步进电机转速的效果。

基于STM32的实现在STM32F1中,定时器有PWM模式,可以用来产生PWM。相关文章:详解STM32中PWM的配置及应用。

但是在STM32的PWM模式下,只要确定时基单位(即确定PWM周期),改变输出比较寄存器,就只能改变PWM的占空比。如果需要改变PWM周期,就需要不断改变定时器的时基单位。

但时基单元与硬件有关,不宜频繁更改。所以STM32下不适合用定时器的PWM方式来控制步进电机的调速。

在从许多来源查找信息后,确定了一种使用输出更准确地控制PWM 周期的方法。Using output comparison to generate PWM with variable frequency 利用输出比较产生可变频率的PWM。

原理简单介绍如下:首先配置定时器时基单元确定最小脉冲长度单元CK。然后开启定时器的输出比较,设置模式为翻转模式,开启输出比较中断。

将定时器中计数器CNT的当前值,加上脉冲长度X(单位为CK),写入输出比较寄存器。在X 个CKs 之后,将触发输出比较中断。

同时水平翻转。在中断中,将当前计数器CNT的值,加上脉冲长度X,写入输出比较寄存器。

在X 个CKs 之后,将触发输出比较中断。同时水平翻转。

在中断中,将当前计数器CNT的值,加上脉冲长度X,写入输出比较寄存器。如此往复…… 这样就可以得到一个占空比为50%,周期为2X CKs的PWM。

为确定最小单元CK,配置时基单元首先确定一个最小间隔CK,规定PWM高电平长度和低电平长度的单位为CK。即高电平的长度必须是CK的整数倍。

低水平也是如此。然后配置定时器的时基单位,通过CK的长度来确定预分频系数。

已知STM32F103的主频为72MHZ,则时基单元中的预分频系数为PSC=72M/(1/CK) 例如rtz确定的CK长度为10us(0.00001s),可以得到等式。 确定预分频因子为720后,将高速晶振产生的72MHZ时钟信号进行720分频,得到100000HZ时钟信号。

即时钟信号每秒变化10万次。每次10us。

同时重载值可以设置为0XFFFF(16位定时器的最大值)。因为本次使用的输出比较方式没有使用更新中断,所以这个值可以自由设置。

TIM_TimeBaseStructure.TIM_Period=0XFFFF;TIM_TimeBaseStructure.TIM_Prescaler=720;TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2,TIM_TimeBaseStructure);开启输出比较通道,设置输出比较模式为翻转模式,配置NVIC,开启输出比较中断,配置输出比较通道:TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_Toggle; TIM_OCInitStructure.TIM_Pulse=500; TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set; TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCIdleState_Reset; TIM_OC1Init(TIM2, TIM_OCInitStructure) ;使能输出比较中断,配置NVIC优先级:TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_Init Structure.NVIC_IRQ ChannelCmd=ENABLE; NVIC_Init(NVIC_InitStructure);在输出比较中断中写中断服务函数,唯一要做的就是取出当前CNT值,加上脉冲长度X,写入输出比较寄存器。当计数器达到0XFFFF(之前设置的重载值)时,加一后自动变为0。

例如当前CNT值为0XFFFF,脉冲长度为5,显然输出比较寄存器应该设置为0X0004来触发下一次中断,而不是0X10004,会造成溢出。因此,脉冲长度加上CNT的值后,需要取0XFFFF的余数,然后写入输出比较寄存器。

int t_m=5;//低电平和高电平的长度void TIM2_IRQHandler(void){if (TIM_GetITStatus(TIM2, TIM_IT_CC1) !=RESET) { TIM_SetCompare1(TIM2,(TIM2-CNT+t_m)%0XFFFF); TIM_ClearITPendingBit (TIM2, TIM_IT_CC1); }} 在中断服务函数中动态调整变量t_m,达到修改PWM频率的效果。

以上就是关于stm32单片机步进电机的文章教程,stm32单片机教程实例-步进电机的速度控制的知识,希望能够帮助到大家!

声明本站所有作品图文均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系我们

Top