文章
博客 网店

 STM8L 通用定时器PWM发生示例程序


原理:
定时器从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;//定时器时钟关闭
}

芯艺工作室    蒙ICP备06005492号
Copyright© 2004-2023 ChipArt Studio All Rights Reserved