本帖最后由 sang523 于 2017-1-18 12:09 编辑
目前在做无极灯调光,用stm8s103,TIM1输出互补的pwm,触发无极灯,现在调整其功率,通过计数PWM脉冲个数并外部加控制硬件来实现,以下是tim1溢出中断里的程序。#pragma vector=TIM1_OVR_UIF_vector
__interrupt void TIM1_OVR_UIF_IRQHandler(void)
{
TIM1_SR1=0X00; //清除中断标志位
switch(flag)
{
case 1:
if(flag1==1)
{
TIM1_ARRH=0X00; //每进入一个状态先进行变频(main里面是一个固定频率)
TIM1_ARRL=110;
TIM1_CCR1H=0X00;
TIM1_CCR1L=55;
TIM1_DTR=7;
PD2=0; //PD2端口是外部加控制硬件的端口,作用于输出pwm口上,既置1为高电平(代表pwm没有输出),置0代表pwm正常输出。
count13++;
if(count13==1000) //在该频率下先数1000个脉冲,保证稳定
{
count13=0;
flag1=1;
}
}
if(flag1==1) //开始进入调整
{
count13++;
if(count13==3) //数3个脉冲后PD2置1,pwm输出受控
{
PD2=1;
}
if(count13==6) //数3个脉冲后PD2置0,pwm正常输出
PD2=0;
count13=0;
}
};break;
case 2: //case 2代表pwm正常输出
PD2=0;flag1=0;break;
}
}
现在我通过ad采电压值来调整功率
while(1)
{
delay1ms(16); //每两次采样间隔为16ms,时间不精确
ADC_CSR=0X06;
ADC1024();
AD5=AD;
if((AD5>=819)&&(AD5<=1024)) //数值都是跟电压值对应的
{
count14++;
if((count14>=100)&&(PD2==0)) //采样100次以上且此时PD2端口为低
TIM1_IER=0X01;flag=2; //中断使能,先正常输出pwm。
}
else if((AD5<819)&&(AD5>=726))
{
count15++;
if((count15>=100)&&(PD2==0))
flag=1; //进入第一种调整状态
}
}
现在我通过改变ad采的电压值使其在1,2状态来回切换,大部分情况下都很理想,灯偶尔会出现重启或死掉
|