STM8学习笔记---PWM变频输出

        在使用STM8的PWM功能时,一般都是改变占空比来改变输出电压大小。但是有时候不需要改变PWM的占空比,而是需要按照一定的规律改变输出PWM的频率,而占空比保持不变。现在总结一下如何实现STM8单片机输出PWM波时动态改变频率。

     直接看C代码的实现

#include "pwm.h"
u16  FRE = 100;             //frequency  频率 4M / 100 = 40K   
void PWM_GPIO_Init( void )
{
    PC_DDR |= ( 1 << 7 );       //PC7 推挽输出
    PC_CR1 |= ( 1 << 7 );
}
void TIM1_Init( void )
{
    PWM_GPIO_Init();
    TIM1_CR1 = (1<<7);                        //自动预装载允许
    
    TIM1_CCMR2 = (6<<4)|(1<<3)|(1<<2);        //TIM1 CH2 PWM1  输出比较1预装载使能  输出比较1 快速使能
    TIM1_CCER1 |= 0x10;                       //CC2为输出 高电平有效    
    
    TIM1_PSCRH = 0x00;                        //预分频 0 
    TIM1_PSCRL = 0x03;                        //16M/(1+3)=4 M
    
    TIM1_ARRH = FRE >> 8;                     //设定自动重装载值高8位
    TIM1_ARRL = FRE;                          //设置自动重装载值低8位
  
    TIM1_BKR = 0x80;                            //刹车寄存器 使能OC1输出 定时器不工作时输出无效电平
    TIM1_EGR = (1<<0);                        //产生更新事件
    TIM1_CR1 |= 0x01;                           //使能计数器
}
//TIM1 CH2  PC7
void TIM1_CH2_FRE_DC_Change( unsigned int freq, unsigned int dc )
{
    TIM1_ARRH = freq >> 8;                     //设置频率
    TIM1_ARRL = freq;
    TIM1_CCR2H = dc >> 8;
    TIM1_CCR2L = dc;
}

      首先初始化PWM口,这里使用的是定时器1通道2,也就是PC7口,下来初始化定时器,将定时器1通道2设置为PWM功能,这里记住一定要开启自动预装载功能,不开起预装载功能,直接改变ARR寄存器的值时,输出的频率也能发生改变,但是输出的PWM波形有时候会出现丢失现象,也就是会有一段时间无波形输出,开启自动预装载功能后,放入ARR寄存器的值不会立即发生改变,而是在更新ARR的值时才发生改变,这样在变频时就能保证输出的每个周期波形都是完整的,不会出现输出PWM波形丢失现象。

     初始化完定定时器后,将频率和占空比的设置单独封装一个函数,这样需要变频的时候,直接调用这个函数就行。

    定时器的时钟设置为4MHz,ARR寄存器的值设置为100时,输出频率为4M/100=40KHz,当ARR寄存器的值设置为1000时,输出频率为4MHz/1000=4KHz,这样当ARR的值在100到1000之间连续变化时,输出的PWM频率就会在40K到4K之间连续变化。

主程序代码如下

#include "iostm8s103F3.h"
#include "led.h"
#include "pwm.h"


void SysClkInit( void )
{
    CLK_SWR = 0xe1;       //HSI为主时钟源  16MHz CPU时钟频率
    CLK_CKDIVR = 0x00;    //CPU时钟0分频,系统时钟0分频
}

void main( void )
{
    unsigned int i = 0;
    SysClkInit();
    __asm( "sim" );
    TIM1_Init();
    __asm( "rim" );
    while( 1 )
    {
        for( i = 100; i < 1000; i++ )
        {
            TIM1_CH2_FRE_DC_Change( i, i / 2 );            
        }
    }
}

      主程序的主要功能就是循环调用TIM1_CH2_FRE_DC_Change()函数来改变频率和占空比,在本例程中将占空比的值设置为频率的一半,这样在任何频率下占空比都是50%。ARR寄存器值设置为100到1000循环变化,这样输出的PWM频率就会在40K到4K之间循环变化。

输出PWM波形如下:

可以看到输出一个脉冲之后频率改变了一次,而占空比没有发生变化。

发布了76 篇原创文章 · 获赞 30 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_20222919/article/details/105388594