最近想利用AVR单片机作为驱动,做一款电源。电压 电流两路模拟信号采集控制一组PWM输出,当出现故障电压或电流或电压、电流超过某一固定值时,单片机ADC检测停止输出PWM,PWM连续重启3次,直到故障消失,才正常输出PWM。反之,PWM连续重启3次故障未消失,则停止输出PWM.
针对以上功能相关程序如下,问题点1:只有电压信号PC0可以关断PWM,
问题点2:多次启动不知道怎么循环,程序未体现。
希望高手能够指导一下,谢谢!
//宏定义
#include<iom8v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
//延时函数
void delay(uint ms) //延时函数(1MHz晶振时)
{ unsigned int i,j; //1ms级
for(i=0;i<ms;i++)
for(j=0;j<136;j++);
}
//快速PWM产生函数 500HZ D=0.5
void pwm50() //
{
DDRB|=BIT(1); //内部1MHz出厂晶振,注意!
TCCR1A=0x81; //1000 0001
TCCR1B=0x0A; //0000 1010
OCR1A=130;
}
//中断函数
void repe_ig() //硬件采用第二版设计
{
uint t;
ACSR=0x40; //0100 0000//模拟比较器控制和状态寄存器//比较器正极由能基准源取代
delay(5);
if(ACSR&BIT(ACO)) //设定1或0
{
for(t=0;t<1;t++)
{
PORTB&=~BIT(0);
delay(4000);
PORTB|=BIT(0);
delay(1000);
if((ACSR&BIT(ACO))==0)
break;
}
}
}
void main()
{
uint addata1,addata0,m,i;
DDRD=0;
DDRB=0xFF;
//PORTB|=BIT(0); //PB0为输出5V,开启
//delay(1000);
//repe_ig();
delay(3000);
//调光部分
DDRC&=~BIT(PC0);
PORTC&=~BIT(PC0);
while(1)
{
ADMUX=0x40; //启动ADC0
ADCSRA=0xA0; //先1010 0000
ADCSRA|=BIT(ADSC); //启动ADSC位,开始转换
while(!(ADCSRA&(BIT(ADIF)))); //判断转换结束语句
addata0=ADCL;
addata0=addata0+ADCH*256;
if((addata0<200))
{
ADMUX=0x41; //启动ADC1
ADCSRA=0xA0; //先1010 0000
ADCSRA|=BIT(ADSC); //启动ADSC位,开始转换
while(!(ADCSRA&(BIT(ADIF)))); //判断转换结束语句
addata1=ADCL;
addata1=addata1+ADCH*256;
if((addata1<200))
{
pwm50();
}
}
else
{
TCCR1A=0;
TCCR1B=0;
}
delay(5);
ADCSRA=0;
delay(5);
}
}
|