STM32F103 PWM(寄存器)控制直流电机

脉冲宽度调制PWM,实现对电机速度的控制。

1、PWM输出原理

假定定时器工作在向上计数 PWM模式,CNT为当前计数值,CCRx为捕获/比较寄存器CCRx的值(预装载值)。当 CNT<CCRx 时,GPIO口 输出低电平0,当 CNT>=CCRx 时,GPIO口 输出高电平1。当CNT达到 ARR (自动重装载值)的时候,重新归零,然后重新向上计数,依次循环。改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的频率。

                                 

2、PWM定时器

STM32 的定时器除了 TIM6 和 TIM7,其他的定时器都可以用来产生 PWM 输出。高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出,通用定时器能同时产生4路的 PWM 输出。这里我们用TIM2定时器的CH1和CH2产生两路PWM输出。

要使通用定时器 TIM2 产生两路 PWM 输出,需要配置的寄存器分别是:自动重载寄存器TIM2_ARR、预分频器TIM2_PSC、控制寄存器TIM2_CR1、 捕获/比较模式寄存器TIM2_CCMR1、捕获/比较使能寄存器TIM2_CCER、捕获/比较寄存器TIM2_CCR1和TIM2_CCR2 ,如果使用的是高级定时器TIM1和TIM8,还需配置刹车和死区寄存器TIMx_BDTR。

3、寄存器配置步骤

(1)开启 TIM2 时钟。

要使用 TIM2,必须先开启 TIM2 的时钟。通过设置APB1外设时钟使能寄存器RCC_APB1ENR对应位即可。

(2)通道CH1和CH2对应的GPIO 口时钟使能。

TIM2定时器CH1和CH2对应的GPIO口为 PA0和PA1,通过设置RCC_APB2ENR时钟使能GPIO口。

(3)PA0和PA1 端口配置

将其设置为复用推挽输出模式。

(4)TIM2_ARR和TIM2_PSC配置

ARR为定时器计数上限,是16位的寄存器,范围为1~65535。PSC为定时器的分频系数,通过这个值可以计算出PWM的频率。根据电机最适合的频率进行分配。

并将其进行预装载使能,TIM2->CCMR1 相关位控制CCRX的预装载使能,TIM2->CR1的APER位控制ARR自动重装载使能

(5) 设置 TIM2_CH1和TIM2_CH2的 PWM 模式及通道方向

要使电机越转越快,可以配置 TIM1_CCMR1 的相关位来控制将其设置PWM 模式1。另外,要配置 CH1和CH2 为输出,所以要设置TIM1_CCMR1 的CC1S[1:0]和 CC2S[1:0]为 00(寄存器默认就是 0,所以这里可以省略)。

(6) 使能 CH1 和 CH2 输出和使能 TIM1 。

我们需要开启 TIM2 的 CH1和CH2 的输出以及 TIM1 的时钟。前者通过 TIM2_CCER 寄存器来设置,是单个通道的开关,后者则通过 TIM2_CR1 寄存器来设置,是整个 TIM2 的总开关。只有设置了这两个寄存器,这样我们才可能在 TIM1 的 CH1和CH2 上看到 PWM 波输出。

(7) 设置 MOE  输出,使能 PWM  输出

普通定时器在完成以上设置了之后,就可以输出 PWM 了,但是高级定时器,我们还需要使能刹车和死区寄存器(TIM1_BDTR)的 MOE 位,以使能整个 OCx(即 PWM)输出。

(8) 修改 TIM2_CCR1 和 TIM2_CCR1 控制占空比

经过以上设置之后,PWM 已经开始输出了,只是其占空比和频率都是固定的,我们通过修改 TIM1_CCR1 和 TIM2_CCR2 则可以控制通道的输出占空比,进而控制电机速度。

4、下面是PWM的寄存器初始化配置

void TIM2_PWM_Init(u16 arr,u16 psc)
{		 					 
	
	RCC->APB1ENR|=1;       //使能TIM2时钟    
	RCC->APB2ENR|=1<<2;        //GPIOA时钟使能     
	GPIOA->CRL&=0XFFFFFF00;    //PA 0 1复位
	GPIOA->CRL|=0X000000BB;    //PA 0 1复用输出
	GPIOA->ODR |= 3;
	
	TIM2->ARR=arr;             //设定计数器自动重装值 
	TIM2->PSC=psc;             //预分频器不分频
	
	TIM2->CCMR1|=6<<12;      //CH2 PWM1模式	
	TIM2->CCMR1|=6<<4;       //CH1 PWM1模式	
	TIM2->CCMR1|=1<<11;      //CH2预装载使能	 
	TIM2->CCMR1|=1<<3;       //CH1预装载使能	 
	
	TIM2->CCER|=1<<4;       //CH2输出使能	   
	TIM2->CCER|=1<<0;        //CH1输出使能	
	//TIM1->BDTR |= 1<<15;     //TIM1必须要这句话才能输出PWM
	
	TIM2->CR1=0x80;        //ARPE使能 
	TIM2->CR1|=0x01;         //使能定时器2 											  
} 

 

 

 

 

  • 15
    点赞
  • 131
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
根据提供的引用内容,可以使用STM32CubeMX和HAL库来配置PA1引脚输出PWM信号。具体步骤如下: 1. 打开STM32CubeMX软件,选择对应的芯片型号(STM32F103C8T6)。 2. 在Pinout选项卡中,找到PA1引脚,将其配置为“TIM2_CH2”功能。 3. 在Configuration选项卡中,找到TIM2定时器,将其配置PWM模式。 4. 在TIM2的Channel2设置中,选择PWM Generation CH2模式,并设置PWM频率和占空比。 5. 生成代码并导入到Keil或者其他编译器中,编译并下载到STM32F103C8T6单片机中。 下面是使用HAL库的代码示例: ```c #include "main.h" #include "tim.h" /* TIM2 PWM 初始化函数 */ void MX_TIM2_Init(void) { TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; htim2.Instance = TIM2; htim2.Init.Prescaler = 71; // 设置预分频系数 htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 999; // 设置计数器自动重装值 htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(&htim2); sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 500; // 设置占空比 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2); HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); } int main(void) { HAL_Init(); MX_TIM2_Init(); while (1) { // do something } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值