stm32入门——PWM控制直流电机变速

stm32入门——PWM输出控制直流电机变速

最近刚做了智能小车的寻迹实验,实验中用了定时器PWM输出来改变直流电机的转速,我在这里就大致总结一下PWM相关的知识。

什么是PWM?
PWM(Pulse Width Modulation)脉冲宽度调制。
占空比:pwm占空比就是一个脉冲周期内有效电平在整个周期所占的比例。
通过调节PWM的占空比就能调节IO口上电压的持续性变化,因此也能够控制外设的功率进行持续性变化,也就能控制直流电机的转速快慢。
那么重点就在于如何调节PWM波形的输出。如下图所示

图中的ARR是我们给定时器的一个预装载值,CCRx的上下变化是产生PWM波的关键。我们假设ARR大于CCRx的部分输出为高电平(即t1-t2、t3-t4、t5-t6),ARR小于CCRx的部分输出为低电平(即0-t1、t2-t3、t4-t5),则改变CCRx的值就能改变输出PWM的占空比。
只要弄明白了上面那幅图,那就不难理解想要控制PWM的输出波形,重要的就是如何设置ARR与CCRx这两个寄存器的值了。

PWM模式、有效电平
前面我们假设ARR大于CCRx时输出为高电平,ARR小于CCRx时输出为低电平,但在实际运用中可能并非如此,有可能是相反的情况——ARR大于CCRx时输出为低电平,ARR小于CCRx时输出为高电平,至于到底是哪种情况,还要看PWM是哪种模式、有效电平又设置的是何种极性了。

模式1:ARR小于CCRx时输出为“有效”电平,ARR大于CCRx时输出为“无效”电平。
模式2:ARR小于CCRx时输出为“无效”电平,ARR大于CCRx时输出为“有效”电平。

注意,我这里用的是“有效”和“无效”,而不是“高”和“低”,也就是说有效电平可高可低,并非一定就是高电平。PWM模式、效电平极性,需要程序员自己配置相关的寄存器来实现。
以下面的代码来讲解
TIM1_PWM_Init(899,0);//不分频。PWM频率=72000/(899+1)=80Khz
我们使用定时器1的通道1来输出一路PWM波,想详细了解定时器参数的设置的朋友可以参考(stm32入门——定时器中断),我这里简单介绍一下,这里的899设置的就是ARR的值,至于那个0是用来设置TIM1的频率的,不分频就代表TIM1的时钟频率和系统时钟相同,这里假设为72MHz。

void TIM1_PWM_Init(u16 arr,u16 psc)
{		 					 
	//此部分需手动修改IO口设置
	RCC->APB2ENR|=1<<11; 	//TIM1时钟使能    
	GPIOA->CRH&=0XFFFFFFF0;	//PA8清除之前的设置
	GPIOA->CRH|=0X0000000B;	//复用功能输出 
	
	TIM1->ARR=arr;			//设定计数器自动重装值 
	TIM1->PSC=psc;			//预分频器设置
  
	TIM1->CCMR1|=7<<4;  	//CH1 PWM2模式		 
	TIM1->CCMR1|=1<<3; 		//CH1预装载使能	 
 	TIM1->CCER|=0<<1;   	//OC1 输出使能	   
	//TIM1->CCER|=1<<1;
	
	
	TIM1->BDTR|=1<<15;   	//MOE 主输出使能	   

	TIM1->CR1=0x0080;   	//ARPE使能 
	TIM1->CR1|=0x01;    	//使能定时器1 										  
}  

前三行是用来配置GPIO口的,这里不解释。
TIM1->ARR=arr; //设定计数器自动重装值
TIM1->PSC=psc; //预分频器设置
这两行就是我上门提到的设置定时器的频率和重装载值。

TIM1->CCMR1|=7<<4; //CH1 PWM2模式
TIM1->CCMR1|=1<<3; //CH1预装载使能
TIM1->CCER|=0<<1; //OC1 输出使能
这三行是用来设置PWM输出模式和设置通道的,通道是什么呢?简单地讲就是输出PWM波的GPIO口,代码一开始不是设置了PA8这个GPIO口嘛,这个PA8就是通道1。使用通道的话要先进行输入输出方向、通道使能的设置。

//TIM1->CCER|=1<<1;
这行我注释掉的代码,就是用来设置“有效电平”极性的,根据手册,当TIM1->CCER[1]这位置1时,有效电平为低电平,置0时有效电平为高电平,而默认情况下置0。

TIM1->BDTR|=1<<15; //MOE 主输出使能
这行代码只要对高级定时器进行设置,普通定时器无需设置。

TIM1->CR1=0x0080; //ARPE使能
这行代码是用来使能ARPE,ARPE是什么呢,就是当它被置1时,你自己设置的CCRx会立即生效,如果它被置为0,那么你自己设置的CCRx值不会立即生效(可能之前ARPE已经有值了),而是当之前设置的CCRx生效后才会使用你最新设置的CCRx值。

上面的代码里没有对CCRx进行设置,这是因为CCRx常常是一个变化的值,你可以在主函数中用一个for循环+if判断语句对它进行++或–的操作,从而达到连续改变CCRx值得目的。例如

for(i=0;i<300;i++){
	TIM1->CCR1=i;
	if(i==300){
		i=0;
	}
}

这里还要说的是PWM波的周期是由 定时器时钟频率 和 预装载值 两者决定的,预装载值就是ARR。我们来具体分析一下,预装载值PSC设置为899,那么,当定时器的当前值val从0增加到899时,一共经过了900个时钟周期,这900个时钟周期会产生一个PWM波形,也就是说900个定时器时钟周期才相当于一个PWM周期,那么PWM的频率就为72MHz/900=80KHz,周期为1/80KHz。


有很多同学私信我很多的问题,也有要手册和源码的,CSDN下载要积分,我放公众hao了:游侠嵌入式。(计科卓越班的可以私我)

  • 83
    点赞
  • 578
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
stm32cubemx是ST官方提供的一款基于STM32控制器的代码生成工具,它可以通过图形化界面配置STM32控制器的各个模块,其中包括PWM模块。PWM(Pulse Width Modulation)控制技术是一种通过改变电信号占空比来控制电机转速的方法,通过快速调整高低电平间隔时间比例实现电机转速精确控制。 在使用stm32cubemx进行PWM控制直流电机转速的过程中,首先需要选择合适的STM32控制器,然后通过图形化配置界面对PWM相关寄存器进行设置,包括控制位宽、定时器预分频、定时器周期、占空比等参数。接着,通过编写一定的控制算法和程序逻辑,根据物理实验结果调整参数,实现电机转速的精确控制。 具体地,PWM控制直流电机转速的实现过程如下:首先,在GPIO配置界面中选择需要控制PWM的引脚,设置为PWM输出模式,接着进入TIMx配置界面,配置计数器的定时器预分频和计数周期,选择PWM模式为Edge-aligned,PWM输出为单极性,PWM极性为低电平有效,最后选择APB1时钟频率并生成代码。然后,在代码中编写PWM控制函数,通过改变占空比实现直流电机转速的控制,最后在主函数中调用PWM控制函数即可。 总之,基于stm32cubemx的PWM控制直流电机转速需要进行一系列的配置和编程,但是这种方法配置简单,实现方便,能够快速实现精确的电机转速控制,更加符合现代工业应用需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值