赞
踩
- /*!
- \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
是八位
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
是0到15位,意思是 计数器周期 最大值为111111111111111 转换为十进制就是32767
我们设置成2000(周期是2ms),具体多大看你怎么用,一般不会太大,我是用PWM驱动电机。
转换为16进制就是 0x07D0
所以pwm_init初始化为 pwm_init(0x4D,0x07D0);
输入 pwm_ch_sc控制寄存器 和 pwm_ch_cnt
- /*!
- \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 信号的周期由模数寄存器 PWM_MOD 的值确定(十六进制0x07D0=十进制2000=2ms)
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控制电机速度。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。