热度 1||
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'
}