Etual 的学习笔记 https://bbs.21ic.com/?289322 [收藏] [复制] [RSS]

日志

PCA 模块- PWM 模式

热度 1已有 1061 次阅读2012-1-9 08:09 |个人分类:C8051F单片机|系统分类:单片机

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 人)

评论 (0 个评论)