学习完了,定时器后,我慢慢看了一下英文的数据手册。静下心来看,才会发现以前看不懂的,都慢慢能懂了。
一个新手的成长之路。后面更难的CAN、SPI、flash等功能,因为分工后,我转CAN网络方向了。接下来,我的侧重点学习之路将有分叉路了。嵌入式单片机我以后一定继续更新和学习。争取早日成为全栈工程师。
8位PWM
void PWM_8INIT(void)
{
//关闭PWME使能,原因是一些寄存器写入要在禁止状态才能写入
PWME = 0x00U;
PWMCTL = 0x00; //不级联,8位
PWMCAE = 0X00; //通道在左对齐输出模式下运行
PWMPOL = 0X01U; //起始高电平
DDRP_DDRP2 = 1; //输出模式
PTP_PTP2 = 1; //高电平
PWMCNT2 = 0x00U; //在左对齐输出模式下,计数器从0计数到周期寄存器-1中的值
PWMPRCLK = 0x00; //不分频 A = B = 8mhz
PWMCLK = 0x01U; // PCLKAB 默认是为0, PCLK 为1 则选择时钟为SA为时钟源
PWMSCLA = 0x10U; //Clock SA = Clock A / (2 * PWMSCLA) = 0.25MHZ
PWMPER2 =250; //PWMx Period = Channel Clock Period * PWMPERx
//信道时钟周期 = (1/0.25mhz)*1000 000 = 4us
//周期 = (4 * 250) /1000= 1ms;
//注意不要超过255
PWMDTY2 = 100; // [PWMDTYx / PWMPERx] * 100%
//注意不要超过25
PWME_PWME2 = 1;
}
16位PWM
void PWM_16INIT(void)
{
//关闭PWME使能,原因是一些寄存器写入要在禁止状态才能写入
PWME = 0x00U;
PWMCTL_CON45 = 1; //级联 4和5
PWMCAE = 0X00; //通道在左对齐输出模式下运行
PWMPOL = 0X01U; //起始高电平
DDRP_DDRP5 = 1; //输出模式
PTP_PTP5 = 1; //高电平
PWMCNT5 = 0x00U; //在左对齐输出模式下,计数器从0计数到周期寄存器-1中的值
PWMPRCLK = 0x00; //不分频 A = B = 8mhz
PWMCLK = 0x01U; // PCLKAB 默认是为0, PCLK 为1 则选择时钟为SA为时钟源
PWMSCLA = 0x04U; //Clock SA = Clock A / (2 * PWMSCLA) = 1MHZ
PWMPER45 =1000; //PWMx Period = Channel Clock Period * PWMPERx
//信道时钟周期 = (1/1mhz)*1000 000 = 1us
//周期 = (1 * 1000) /1000= 1ms;
PWMDTY45 = 500; // [PWMDTYx / PWMPERx] * 100%
PWME_PWME5 = 1;
}
寄存器讲解
PWM启用寄存器(PWME)
每个PWM通道都有一个使能位(PWMEx)以启动其波形输出。当设置了任何PWMEx位(PWMEx=1)时,立即启用相关的PWM输出。然而,由于PWMEx和时钟源的同步,实际PWM波形在相关PWM输出上不可用,直到其时钟源开始其下一个周期。
注意:当两个pwm进行级联成16位的时候,要判断那个控制寄存器是有效位 0 2 4 6 这四位无效
0 脉宽通道X被禁用。
1 启用脉宽通道x。如果CON67 / CON45 / CON23 / CON01 =1,则偶数位无效,PWM输出偶数位被禁用
PWME = 0x00; //选禁用pwm
PWME = 0x08U; //启用通道三
PWM控制寄存器(PWMCTL)P631
最多有四个控制位用于级联,每个控制位用于将一对PWM通道级联成一个16位通道。如果特定导数上不存在相应的通道,则对这些位的写入无效,读取将返回零。当通道6和7被级联时,通道6寄存器成为双字节通道的高阶字节。当通道4和5连接时,通道4寄存器成为双字节通道的高阶字节。当通道2和3连接时,通道2寄存器成为双字节通道的高阶字节。当通道0和1连接时,通道0寄存器成为双字节通道的高位字节。
PWMCTL_CON01 = 0; //8位通道
PWMCTL_CON01 = 1; //16位通道
PWM中心对齐启用寄存器(PWMCAE)
PWMCAE寄存器包含八个控制位,用于选择每个PWM通道的中心对齐输出或左对齐输出。
如果CAEx位设置为1,则相应的PWM输出将居中对齐。
如果清除了CAEx位,则相应的PWM输出将左对齐。
PWMCAE_CAE0 = 0; //当处于级联模式,奇数位为控制位,只需要配置奇数位就行。左对齐
PWM极性寄存器(PWMPOL)
如果极性位为 1,则PWM通道输出在周期开始时为高,然后在达到占空比时变低。
如果极性位为 0,则输出从低开始,然后在达到占空比计数时变高。
PWMPOL_PPOL0 = 1; //在没有到达占空比时,高电平是有效位
引脚要设置为输出模式;
PWM通道计数器寄存器(PWMCNTx)
PWMCNT0 = 0x00; //从零位开始计数
PWM通道占空寄存器(PWMDTYx)
极性 = 0 (PPOL x =0)
Duty Cycle = [(信道周期-占空)/信道周期] * 100%
• 极性 = 1 (PPOLx = 1)
Duty Cycle = [占空比 / 信道周期] * 100%
占空小于信道周期
PWM信道周期寄存器(PWMPERx)
要计算输出周期,取感兴趣信道(A、B、SA或SB)的选定时钟源周期,并将其乘以该信道周期寄存器中的值:
左对齐 (CAEx = 0)
PWMx 周期 = 信道时钟周期 * 信道周期 1/总线时钟 *信道周期
• 中心对齐 (CAEx = 1)
PWMx 周期 = 信道时钟周期 * (2 * 信道周期)
PWM预缩放时钟选择寄存器(PWMPRCLK)
PWMPRCLK = 0x02U //pcak = 1 四分频
PWM比例A寄存器(PWMSCLA)
PWMSCLA是用于缩放时钟A以生成时钟SA的可编程缩放值。时钟SA是通过取时钟A,将其除以PWMSCLA寄存器中的值并将其除以2来生成的。 (时钟A SA )
时钟 SA = 时钟A / (2 * PWMSCLA)
PWM时钟A/B选择寄存器(PWMCLKAB)
PWMCLK_PCLK0 = 1;
PWM时钟选择寄存器(PWMCLK)
PWMCLK_PCLK0 = 1;