芯片:STM8S003F3P6
实现目标:根据ADC采样信号,实时变换PWM波的频率
遇到问题:程序执行过程,会有偶尔丢PWM波,丢波时间持续大概几个ms,之后又恢复正常发PWM波,不知道什么原因造成?
程序框架:
main()
{
CLK->CKDIVR=0X00;
asm("sim");
TIM2_Init();
TIM1_OC1_Init();//下桥初始化,
TIM1_OC3_Init();//上桥初始化
ADC_Init();
asm("rim");
while(1)
{
}
}
void TIM2_Init(void)
{
TIM2->PSCR=0X01;//2分频,fmaster/2
TIM2->ARRH=(unsigned char)(1600>>8);//1600*1/8M=200us
TIM2->ARRL=(unsigned char)(1600);
TIM2->CNTRH=(unsigned char)(1600>>8);
TIM2->CNTRL=(unsigned char)(1600);
TIM2->CR1|=0X01;//计数器使能,开始计数
TIM2->IER=0X01;//中断使能
}
void TIM1_OC1_Init(void)
{
TIM1->CCMR1=(7<<4)|(1<<3);//|(1<<2);//TIM1 CH1 PWM1模式110,fast enable
TIM1->CCER1=(1<<0)|(0<<2)|(1<<1)|(0<<3);//cc1e=1,cc1ne=0,CC1p=1,CC1NP=0
TIM1->OISR=0X00;//配置空闲状态OC1输出状态
}
void TIM1_OC3_Init(void)
{
TIM1->CNTRH=(unsigned char)(400>>8);//计数寄存器赋初值
TIM1->CNTRL=(unsigned char)(400&0xff);
TIM1->CCMR3=(7<<4)|(1<<3);//|(1<<2);//TIM1 CH3 PWM1模式;
TIM1->CCER2=(1<<0)|(0<<2)|(1<<1)|(0<<3);//cc1e=1,cc1ne=0,CC1p=1,CC1NP=0
TIM1->IER=0X01;//定时器溢出时产生中断
TIM1->OISR=(1<<4);//Output idle register置位
TIM1->CR1=0X61;//中央对齐,开定时器
TIM1->BKR=0X80;//Break Register开启
TIM1->EGR|=0X01;//event generation register置1
}
void ADC_Init(void)
{
ADC1->CR1=0X00;//单次,fmaster/2
ADC1->CSR=0X04;//AIN4选择
ADC1->CR2|=0X08;//右对齐
ADC1->CR1|=0X01;//低功耗唤醒
}
#pragma vector=0x0F
__interrupt void TIM2_UPD_OVF_BRK_IRQHandler(void)
{
CTRL_PWM();
ADC1->CR1|=0X01;//ADC转换开启
ADC1->CSR|=(1<<5);//EOICE置位1,使能中断
TIM2->SR1&=0XFE;//清除更新中断标志
}
#pragma vector=0x0D
__interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void)
{
TIM1->SR1&=0XFE;//清除更新中断标志
}
#pragma vector=0x0018
__interrupt void ADC1_IRQHandler(void)
{
ADCValue=(unsigned int)ADC1->DRL;
ADCValue|=(unsigned int)ADC1->DRH<<8;
Vdc=(unsigned int)((unsigned long)ADCValue*500/1023);//Vdc实际值计算
if(Vdc<=440)Vdcindex=(unsigned char)(Vdc>>1);
else
{
Vdcindex=219;
}
while((ADC1->CSR&0X80)==0);//等待转换结束
ADC1->CSR &=~0x80;
}
void CTRL_PWM()//查表计算频率值,并完成装载
{
DutyL = 72;
DutyH=DutyL-16;
Frequency=Freq[Vdcindex];//根据Vdcindex值查表得到PWM波频率值
TIM1->ARRH=(unsigned char)(Frequency>>8);
TIM1->ARRL=(unsigned char)(Frequency);
TIM1->CCR1H=(unsigned char)(DutyL>>8);
TIM1->CCR1L=(unsigned char)(DutyL);
TIM1->CCR3H=(unsigned char)(DutyH>>8);
TIM1->CCR3L=(unsigned char)(DutyH);
}
如果你采集到的值转变为周期值小于72了就不会输出高低电平了吧,一直是一个电平,所以你可以仿真看一下你采集到的值是不是>>1后有可能小于72了
大家还有什么建议吗