MC9S12g128 PWM

学习完了,定时器后,我慢慢看了一下英文的数据手册。静下心来看,才会发现以前看不懂的,都慢慢能懂了。
一个新手的成长之路。后面更难的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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值