这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » PCA 模块- PWM 模式

共1条 1/1 1 跳转至

PCA 模块- PWM 模式

助工
2014-11-13 19:21:14     打赏

8bit PWM 模式
1,设置 OSCICN 设定内置时钟和分频比,例如设置 SYSCLK 为 12MHZ 并且分频为 1
2,CROSSBAR 设置输出引脚,并且设置 push-pull输出模式
3,PCA0CN = 0x00; 停止定时器
4,设置时基,例如选择系统时钟 PCA0MD = 0x08; 这个影响的是PWM 的周期
5,选择模式为 8bit PWM ,PCA0CPM0 = 0x42;
6,设置 PCA0CPH0 为自动装载的值,改变它就是改变占空比了



16bit PWM 模式
其实差不多,不过,因为16位寄存器要需要同步在终端中赋值。


void PCA0_Init (void)
{
   // Configure PCA time base; overflow interrupt disabled
   PCA0CN = 0x00;                      // Stop counter; clear all flags
   PCA0MD = 0x08;                      // Use SYSCLK as time base
   PCA0CPM0 = 0xCB;                    // Module 0 = 16-bit PWM mode and
                                       // enable Module 0 Match and Interrupt
                                       // Flags
   // Configure initial PWM duty cycle = 50%
   CEX0_Compare_Value = 65536 - (65536 * 0.5);
   PCA0CPL0 = (CEX0_Compare_Value & 0x00FF);
   PCA0CPH0 = (CEX0_Compare_Value & 0xFF00)>>8;
   EIE1 |= 0x10;                       // Enable PCA interrupts
   // Start PCA counter
   CR = 1;
}


void PCA0_ISR (void) interrupt 11
{
   CCF0 = 0;                           // Clear module 0 interrupt flag.


   PCA0CPL0 = (CEX0_Compare_Value & 0x00FF);
   PCA0CPH0 = (CEX0_Compare_Value & 0xFF00)>>8;
}



如果需要输出 0% 或者 100% 的pwm,则
if (CEX0_Compare_Value == 0xFFFF)
{
    PCA0CPM0 &= ~0x40;         // Clear ECOM0
}


if ((PCA0CPM0 & 0x40) == 0x00)
{
    PCA0CPM0 |= 0x40;          // Set ECOM0 if it is '0'
}


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]