STM32 PWM

转自:http://blog.csdn.net/dazhaozi/article/details/6868414

由于STM32没有专门的PWM引脚,所以使用IO口的复用模式,通用定时器TIM2-TIM5每个可以产生4PWMCH1-CH4)。

一:首先,配置GPIO为复用模式,如下图:(截图自:STM32中文参考手册)







例如开启TIM3CH2通道PWM,查表知该通道关联的是PA7口,所以,配置PA7为输出,并设置它为复用输出。

GPIOA->CRL&=0X0FFFFFFF;//PA7输出

GPIOA->CRL|=0XB0000000;//复用功能输出

如何选择开启每个定时器中的4PWM呢?这就用到捕获/比较模式寄存器(TIMx_CCMR1/2),该寄存器总共有2个,TIMx _CCMR1和TIMx _CCMR2。TIMx_CCMR1控制CH1和2,而TIMx_CCMR1控制CH3和4。该寄存器如图(下排为输入模式):

这里要用到的是模式设置位(12-14、4-6位)OCxM,此部分由3位组成。总共可以配置成7种模式,若要使用PWM模式,则将这3位设置为110/111。这两种PWM模式的区别就是输出电平的极性相反,即高电平或低电平时间所占总周期的比例,110为高电平时间所占总周期比例;

还有使能位11位、3位,置1预装载使能CH2和CH1。

预装载使能打开并未真正打开PWM通道,还有两个开关,一个是单通道使能—TIMx_CCER寄存器,一个是TIMx开关TIMx_CRx。

TIMx_CCER寄存器控制CH1—CH4输入输出通道的开关,只需设置对应的CCxE位为1即可将PWM信号输出到对应的输出引脚。 该寄存器如下图:

 

TIMx_CRx寄存器:需要打开该寄存器自动重装载预装载允许位ARPE (第7位)。注:个人认为不对该寄存器操作也可。

二:配置TIM3的ARR寄存器和PSC寄存器,确定PWM频率。

这里配置的这两个定时器确定了PWM的频率,我的理解是:PWM的周期(频率)就是ARR寄存器值与PSC寄存器值相乘得来,但不是简单意义上的相乘,例如要设置PWM的频率参考上次通用定时器中设置溢出时间的算法,例如输出100HZ频率的PWM,首先,确定TIMx的时钟,除非APB1的时钟分频数设置为1,否则通用定时器TIMx的时钟是APB1时钟的2倍,这时的TIMx时钟为72MHz,用这个TIMx时钟72MHz除以(PSC+1),得到定时器每隔多少秒涨一次,这里给PSC赋7199,计算得定时器每隔0.0001秒涨一次,即此时频率为10KHz,再把这个值乘以(ARR+1)得出PWM频率,假如ARR值为0,即0.0001*(0+1),则输出PWM频率为10KHz,再假如输出频率为100Hz的PWM,则将ARR寄存器设置为99即可。如果想调整PWM占空比精度,则只需降低PSC寄存器的值即可。

三:TIMx_CCRx寄存器,确定PWM的占空比。

TIMx_CCR1—TIMx_CCR4确定定时器的CH1—CH4四路PWM的占空比。直接给该寄存器赋0—65535值即可确定占空比。占空比计算方法:TIMx_CCRx的值除以ARR寄存器的值即为占空比,因为占空比在0—100%之间,所以一般TIMx_CCRx寄存器值不能超过ARR寄存器的值,否则可能会引起PWM的频率或占空比的准确性。

TIMx_CCRx寄存器如下图所示:

STM32 PWM输出函数(举例TIM3-CH2

void PWM_Init(u16 arr,u16 psc)

{    

RCC->APB1ENR|=1<<1;       //TIM3时钟使能    

  

GPIOA->CRL&=0X0FFFFFFF;//PA7输出

GPIOA->CRL|=0XB0000000;//复用功能输出 PWM模式  

TIM3->ARR=arr;//设定计数器自动重装值 

TIM3->PSC=psc;//预分频器不分频

TIM3->CCMR1|=6<<12;  //CH2 PWM2模式(高电平为占空比)  

TIM3->CCMR1|=1<<11; //CH2预装载使能    

TIM3->CCER|=1<<4;   //OC2 输出使能    

TIM3->CR1=0x8000;   //ARPE使能 

TIM3->CR1|=0x01;    //使能定时器   

}       


新手上路,如有错误,欢迎指正。



转自:http://blog.csdn.net/akunainiannian/article/details/24316143

一、stm32的pwm输出引脚是使用的IO口的复用功能。

二、T2~T5这4个通用定时器均可输出4路PWM——CH1~CH4。

三、我们以tim3的CH1路pwm输出为例来进行图文讲解(其它类似),并在最后给出tim3的ch1和ch2两路pwm输出的c代码(已在STM32F103RBT6上测试成功,大家放心使用!)。

四、给出了PWM频率和占空比的计算公式。

步骤如下:

1、使能TIM3时钟

RCC->APB1ENR |= 1 << 1;

2、配置对应引脚(PA6)的复用输出功能

GPIOA->CRL &= 0XF0FFFFFF;//PA6清0
GPIOA->CRL |= 0X0B000000;//复用功能输出(推挽50MHz输出)
GPIOA->ODR |= 1 << 6;//PA6上拉

3、设定计数器自动重装值及是否分频

TIM3->ARR = arr;//设定计数器自动重装值(决定PWM的频率)
 TIM3->PSC = psc;//预分频器,0为不分频

4、设置PWM的模式(有1和2两种模式,区别在于输出电平极性相反),根据需求选一种即可

注:TIMX_CCMR1决定CH1~CH2路,TIMX_CCMR2决定CH3~CH4路。

//TIM3->CCMR1 |= 6 << 4;//CH1 PWM1模式 

TIM3->CCMR1 |= 7 << 4;//CH1 PWM2模式 
 TIM3->CCMR1 |= 1 << 3;//CH1预装载使能

5、输出使能设置

TIM3->CCER  |= 1 << 0;//输入/捕获1输出使能

6、自动重装载预装载允许位(ARPE) 及 定时器 使能

TIM3->CR1 = 0X0080;//ARPE使能(此句不配置也行)
TIM3->CR1 |= 0X01;//使能定时器3

 

下面给出TIM3_CH1及TIM3_CH2的PWM输出代码:

void PWM_Init_TIM3_CH1(u16 arr, u16 psc)
{

    //1、使能TIM3时钟   

    RCC->APB1ENR |= 1 << 1;//使能TIM3时钟

    //2、配置对应引脚(PA6)的复用输出功能

    GPIOA->CRL &= 0XF0FFFFFF;//PA6清0
    GPIOA->CRL |= 0X0B000000;//复用功能输出(推挽50MHz输出)
    GPIOA->ODR |= 1 << 6;//PA6上拉   

    //3、设定计数器自动重装值及是否分频

    TIM3->ARR = arr;//设定计数器自动重装值(决定PWM的频率)
    TIM3->PSC = psc;//预分频器 0为不分频
    //4、设置PWM的模式
    TIM3->CCMR1 |= 7 << 4;//CH1 PWM2模式 
    TIM3->CCMR1 |= 1 << 3;//CH1预装载使能    
    //5、输出使能设置

    TIM3->CCER  |= 1 << 0;//输入/捕获1输出使能

    //6、自动重装载预装载允许位(ARPE) 及 定时器 使能

    TIM3->CR1 = 0X0080;//ARPE使能
    TIM3->CR1 |= 0X01;//使能定时器3
}

void PWM_Init_TIM3_CH2(u16 arr, u16 psc)
{
    RCC->APB1ENR |= 1 << 1;//使能TIM3时钟
    
    GPIOA->CRL &= 0X0FFFFFFF;//PA7清0
    GPIOA->CRL |= 0XB0000000;//复用功能输出(推挽50MHz输出)
    GPIOA->ODR |= 1 << 7;//PA7上拉

    TIM3->ARR = arr;//设定计数器自动重装值(决定PWM的频率)
    TIM3->PSC = psc;//预分频器 不分频

    TIM3->CCMR1 |= 7 << 12;//CH2 PWM2模式
    TIM3->CCMR1 |= 1 << 11;//CH2预装载使能

    TIM3->CCER  |= 1 << 4;//输入/捕获2输出使能
    TIM3->CR1 = 0X0080;//ARPE使能
    TIM3->CR1 |= 0X01;//使能定时器3
}

 频率:

//Fpwm = 72M / ((arr+1)*(psc+1))(单位:Hz)
占空比:

//duty circle = TIM3->CCR1 / arr(单位:%)

注:本文方法的一个定时器4个通道的pwm输出的频率是相同的,但占空比可以不同!


  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值