本帖最后由 cl234583745 于 2014-10-21 14:35 编辑
mc9s08dz60总线24m
市电半个周期10ms 要在期间输出50%占空比。定时5ms取反一次。逻辑分析仪看出来,开始还可以,然后就不同步了。需要在电压取反后关闭定时器,等外部中断检测到0电压时候再开始定时5ms后,再取反。大概就能同步了。但我关闭不了定时器啊,改怎么弄
程序的过程:等待市电过零点 (外部中断)---开始定时器2 (定时5ms)----5ms时间到了电平取反----5ms时间到了电平取反
市电半个周期10ms 总是和这2个5ms不匹配。怎么办呢?我等第一个5ms过后 TPM2SC_TOIE=0;(想关闭定时器,等待外部中断时候再开定时器TPM2SC_TOIE=1;)结果这两条语句加上后 一直也不启动定时器了
//=================================================================================================
//函数名:Init_tpm2_counter
void Init_tpm2_counter2(void)
{
TPM2SC=0x0e;//TPM1时钟源为总线时钟;分频系数为64;溢出中断允许
TPM2CNTH=0;//任意时刻对TPM1CNTH或TPM1CNTL的写操作将计数寄存器的计数值复位(清零)
TPM2MOD=1875; //5ms 总线24m mod/(24m/64)=mod/375=5ms
}
//==================计数器2溢出中断服务程序==========================
interrupt VectorNumber_Vtpm2ovf void TPM2_OVF_ISR(void)
{
TPM2CNTH=0;
if((TPM2SC & 0x80)==0x80)
{
TPM2SC_TOF=0;
yanshi_f l g=1;//5ms时间到了
}
}
void Init_IRQ(void)
{
IRQSC_IRQMOD=0;//0:边沿方式;1:电平方式
IRQSC_IRQIE=1;//0:中断使能;1:禁止中断
IRQSC_IRQPE=1;//1:中断引脚使能;0:普通IO
IRQSC_IRQEDG=1;//0下降沿或低电平信号有效 1上升沿 高电平
}
interrupt VectorNumber_Virq void IRQ_ISR(void)
{
if((IRQSC & 0x08)==0x08)
{
IRQSC_IRQACK=1;//清除外部中断标志位
guoling_f l g=1;
}
}
void jrys(void) //加热延时
{
if(guoling_标志寄存器==1) //过零 中断
{
guoling_f l g=0;
TPM2SC_TOIE=1; //使能定时器2
TPM2MOD=1875; //开始计时5ms
}
}
void jrcf(void) //加热触发
{
if(yanshi_f l g==1) //5ms时间到了
{ yanshi_f l g=0;
KKG_WIND=~KKG_WIND; //输入驱动
}
}
for(;;)
{
jrys();
jrcf();
} |