本帖最后由 心印菩提 于 2015-8-10 20:44 编辑
找到了问题所在,让我来终结这个帖子吧
如图,实际比较器由ECOMn和PWMn共同使能
因此把CR = ~CR修改一下就可以了
但是事实使用时有一点不一样
ECOMn禁止后,输出为低
PWMn禁止后,输出为高
就这样
==============================================================
写这个程序的目的是准备给无刷直流电机提供驱动信号
需要的是给一个低频方波信号里面填充较高频率的PWM波
思路是设置好PCA的寄存器,包括PWM的占空比和频率
然后用定时器0来控制CR,即PCA0CN 寄存器的第6位,周期性的使能和禁止PWM输出,实现PWM的填充
产生类似调制波一样的波形
大概程序如下:
void PCA0_Init (void)
{
char SFRPAGE_save = SFRPAGE; // Save current SFR Page
SFRPAGE = PCA0_PAGE;
// configure PCA time base; overflow interrupt disabled
PCA0CN = 0x00; // Stop counter; clear all flags
PCA0MD = 0x00; // Use SYSCLK as time base
PCA0CPM0 = 0x42; // Module 0 = 8-bit PWM mode
// Configure initial PWM duty cycle = 50%
PCA0CPH0 = 256 - (256 * 0.2);
// Start PCA counter
CR = 1;
SFRPAGE = SFRPAGE_save;
}
void Timer_Init()
{
char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = TIMER01_PAGE;
TMOD = 0x01;
TH0 = 0xF4;
TL0 = 0x00;
EA=1; //总中断开
TR0=1; //定时方式
ET0=1;
SFRPAGE = SFRPAGE_SAVE;
}
void Timer0_ISR(void) interrupt 1
{
char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = TIMER01_PAGE;
TH0 = 0xF4;
TL0 = 0x00;
SFRPAGE = PCA0_PAGE;
CR = ~CR;
SFRPAGE = SFRPAGE_SAVE;
}
本来希望得到的是第三张图一样的波形,没有PWM的部分为低电平
但是输出在图1和图3之间不断的跳变,有时没有PWM的部分为高,有时为低,感觉不受控
请问这个问题出在哪儿
我试过在中断里直接 CR = 0 ,输出是恒低的
非常感谢
|