|
本帖最后由 5695585 于 2015-8-8 23:33 编辑
写这个程序的目的是准备给无刷直流电机提供驱动信号
需要的是给一个低频方波信号里面填充较高频率的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 ,输出是恒低的
非常感谢
试过在CR = 0的时候控制P0.0输出低电平
void Timer0_ISR(void) interrupt 1
{
char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = TIMER01_PAGE;
TH0 = 0xF4;
TL0 = 0x00;
SFRPAGE = PCA0_PAGE;
CR = ~CR;
if(CR == 0)
{
SFRPAGE = CONFIG_PAGE;
XBR0 = 0x00; P0MDOUT = 0xFF;
P0 &= 0xFE;
XBR0 = 0x08;
}
SFRPAGE = SFRPAGE_SAVE;
}
但一点用都没有
请教各位问题出在哪儿
非常感谢
|
评分
-
查看全部评分
|