原理:
定时器从0数到寄存器ARR设定值后又从0开始向上数,这是向上计数模式
当定时器计数值小于CCR1寄存器值时通道1对应引脚上输出低电平,当计数值大于CCR1寄存器时通道1对应引脚输出高电平,这样就会在通道1引脚上输出一个方波,可通过CCR1值来设置一个周期内的高电平所占时间和低电平所占时间,也可通过调整ARR寄存器值调整一个周期所占用的时间,也就是波形的频率。
本示例在STM8S051上实现,使用通用定时器TIM3,在其通道1引脚PB1上输出10KHz,50%占空比的PWM波形。
#define F_CPU 2000000 //系统时钟2MHz
//设置PWM频率和上空比 freq:以KHz为单位的频率值 ratio:0~100 高电平百分比
void pwm_set(uint16_t freq,uint8_t ratio)
{
uint16_t tmp;
//设置占空比
tmp=(F_CPU/1000/freq)*ratio;
tmp/=100;
TIM3->CCR1H=tmp>>8;
TIM3->CCR1L=tmp;
//设置频率
tmp=(uint16_t)(F_CPU/1000/freq);
TIM3->ARRH=tmp>>8;
TIM3->ARRL=tmp;
}
void pwm_en(void)
{
CLK->PCKENR1 |= CLK_PCKENR1_TIM3;//TIM3定时器时钟允许
TIM3->ARRH = 0;//(F_CPU/10000)>>8;//自动装载值
TIM3->ARRL = 200;//(F_CPU/10000)&0XFF;
TIM3->PSCR = 0;//不分频
TIM3->CCR1H=0;
TIM3->CCR1L=100;
TIM3->CCMR1=(6<<4)|TIM_CCMR_OCxPE; //PWM模式1 预装载使能 通道1设置为输出
TIM3->CCER1=TIM_CCER1_CC1E;//通道1输出引脚连接,高电平有效
TIM3->BKR|=TIM_BKR_MOE;//主输出使能,此处与STM8S不同,需注意
TIM3->CR1 = TIM_CR1_ARPE|TIM_CR1_CEN;//向上计数,预装载,开始计数
}
void pwm_ds(void)
{
TIM3->CR1=0;//关闭定时器
CLK->PCKENR1&=~CLK_PCKENR1_TIM3;//定时器时钟关闭
}
|
|