PWM寄存器初始化

本模块主要实现输出频率占空比可调的 PWM 波形功能和输入捕获功能,同时也可作为计数器使用。

一、主要特性

1. 16位向上或向下计数器;
2. 支持最多6路PWM通道;
3. 每个通道支持输出比较或边缘对齐PWM模式波形输出,支持设置、清除、切换输出比较操作,PWM输出的 极性可选;
4. 每个通道支持上升、下降或任何边输入捕捉触发;
5. 在所有通道上,支持中央对齐脉冲宽度调制;
6. 定时器时钟源,可选为系统时钟、晶振时钟或外部时钟输入,支持时钟 1/2/4/8/16/32/64/ 128分频;
7. 支持每个通道一个功能中断以及计数器溢出中断;
8. 每个通道口和外部时钟口单独使能选通,支持PWM计数工作时不使能通道口或外部时钟口,它们均可单 独配置作为GPIO功能使用;
9. 支持支持PWM计数触发ADC采样;

二、初始化

pwm_init

/*!
    \brief      pwm initialize 
    \param[in]  pwm_sc: pwm control register  
    \param[in]  pwm_mod: pwm mod count        
    \param[out] none
    \retval     none
*/
void pwm_init(uint8_t pwm_sc,uint16_t pwm_mod)
{
    PWM_MOD = pwm_mod;
    PWM_SC = pwm_sc;
    if((pwm_sc & PWM_SC_TOIE) != 0U){
        NVIC_EnableIRQ(PWM_TOF_IRQN);
    }else{
        NVIC_DisableIRQ(PWM_TOF_IRQN);
    }
}

输入的是 pwm_sc寄存器和pwm_mod  

pwm_sc寄存器:

是八位

0-2位是 PWM_SC_CLK_DIV   (XXX)   计数时钟为X的 PWM_SC_CLK_DIV次幂分频

3-4位 PWM_SC_CLK_SEL  (01)  表示选择系统时钟计数

5位 PWM_SC_CPWMS   (0)  表示向上计数

6位 PWM_SC_TOIE  (1) 打开中断使能

7位 PWM_SC_TOF (0) 未溢出

0-2位PWM_SC_CLK_DIV寄存器如下,我们选择32分频就是5 转化为2进制为 (101) 

 则pwm_sc配置为 01001101 转换为16进制为0x4D

 pwm_mod寄存器:

是0到15位,意思是 计数器周期 最大值为111111111111111 转换为十进制就是32767

计数器模数寄存器
配置计数器周期,系统复位或写PWM_CNT寄存器均清零计数器。写入模
数寄存器前需关闭计数器或复位计数器,以避免造成首次计数器溢出
发生时间的混乱。

 我们设置成2000(周期是2ms),具体多大看你怎么用,一般不会太大,我是用PWM驱动电机。

转换为16进制就是 0x07D0

所以pwm_init初始化为    pwm_init(0x4D,0x07D0);

pwm_ch1_init 通道初始化

输入 pwm_ch_sc控制寄存器 和 pwm_ch_cnt

pwm_ch_sc

/*!
    \brief      pwm channel 1 initialize 
    \param[in]  pwm_ch_sc: pwm channel 1 control register
    \param[in]  pwm_ch_cnt: pwm channel 1 count  
    \param[out] none
    \retval     none
*/
void pwm_ch1_init(uint8_t pwm_ch_sc,uint16_t pwm_ch_cnt)
{
    PWM_C1SC = pwm_ch_sc;
    PWM_C1V = pwm_ch_cnt;   //占空比
    if((pwm_ch_sc & PWM_CnSC_IE) != 0U){
        NVIC_EnableIRQ(PWM_CH1_IRQn);
    }else{
        NVIC_DisableIRQ(PWM_CH1_IRQn);
    }
}

0-2位是 PWM_SC_CLK_DIV   (000)   计数时钟为2的 PWM_SC_CLK_DIV次幂分频

3-4位 PWM_SC_CLK_SEL  (01)  表示选择系统时钟计数

5位 PWM_SC_CPWMS   (1)  表示向上计数后向下计数(中央对齐)

6位 PWM_SC_TOIE  (1) 打开中断使能

7位 PWM_SC_TOF (0) 未溢出

pwm_ch1_sc 为 01101000


pwm_ch_cnt

计数值寄存器
记录当前计数值,系统复位或写该寄存器均清零计数器。

 三、周期和占空比

PWM 信号的周期由模数寄存器 PWM_MOD 的值确定(十六进制0x07D0=十进制2000=2ms)

占空比由通道寄存器 PWM_C x V 中的设置确定。这个 PWM 信号的极性由 PWM_C x SC_ELS 控制位中的设置确定。0%和 100%的占空比 都是可能的。

PWM_CxV在pwm_ch1_init通道初始化里面  PWM_C1V = pwm_ch_cnt;

PWM_C1V  是寄存器地址如下

 占空比 = (pwm_ch_cnt)/(pwm_mod)

50% = 1000/2000 = 0x03E8 / 0x07D0

然后pwm就一直输出50的占空比,如果要调整占空比就调整pwm_ch_cnt大小。

在硬件上原理大概就是pwm输入高电平,导致三极管连通,然后使正负极相连然后驱动电机,接着占空比的速度就是在周期内设置高电平的时间。一个周期全是高电平他就是100%占空比。

方向的话一般配合继电器控制电机方向,PWM控制电机速度。

猜你喜欢

转载自blog.csdn.net/qq_51679917/article/details/130195075