|
发表于 2012-5-23 21:33:37
|
显示全部楼层
本帖最后由 huangfan 于 2012-5-23 21:36 编辑
限于篇幅,显示程序就不贴了
/*ADC采集,单次模式*/
uint Adconvert()
{
uint ret;
SREG=0x80; // 全局中断使能
ADMUX=0xC0; //内部2.56V,0通道
//ADCSRA=_BV(ADEN)|_BV(ADSC)|_BV(ADFR)|_BV(ADIE)|_BV(ADPS2)|_BV(ADPS1);
//ADC使能,开始转换,连续转换,中断使能,,CK/64 8M/64=125KHz ,125KHz-8us,8us*13=104us 采样频率9.615KHz
ADCSRA=_BV(ADEN)|_BV(ADSC)|_BV(ADPS2)|_BV(ADPS1);
//ADC使能,开始转换,CK/64 8M/64=125KHz ,125KHz-8us,8us*25=200us
//连续转换1次
PORTD|=_BV(PD0); //PD0 置0 测试AD转换时间
DDRD|=_BV(PD0); //PD0 设输出
//_delay_loop_1(60);
while(ADCSRA&_BV(ADSC))
//_delay_loop_1(60);
_delay_us(1); //采样保持时间〉1.5个ADC周期
ret=ADCL;
ret|=(uint)(ADCH<<8);
PORTD&=~_BV(PD0); //PD0 置0
SREG=0x80; //开总中断
ADCSRA=0; //关闭ADC
return(ret);
}
/*差分方程运算*/
SIGNAL(SIG_OUTPUT_COMPARE2) //INTERRUPT
{
//int32_t Vref=2500; //Vref=Ref*2.5=400*2.5=2.000V
//int32_t Ref=Vref/2.5;
int32_t Ref=999;
en=Ref-Adconvert();
PORTD|=_BV(PD1); //示波器测试点开 测试计算时间
DDRD=_BV(PD1)|_BV(PD5)|_BV(PD6);
en=en<<10; //en左移10位,相当于乘以1024
Un=Un_1+1800.005*en-1799.995*en_1; //差分方程
if(Un<0) //设置最小占空比
{Un=2;}
else if(Un>1020*1024) //设置最大占空比
{Un=1020*1024;}
//else
//{Un=Un;}
Un_1=Un;
en_1=en;
y=Un>>10;
OCR1A=y; // 设置PWM占空比
PORTD&=~_BV(PD1); //示波器测试点关
y=2.5*y;
NO1=y/1000;
NO2=(y-=NO1*1000)/100;
NO3=(y-=NO2*100)/10;
NO4=(y-=NO3*10);
}
void main(void)
{
uint i,t;
init_devices();
LCD_write_command(0x01); //清屏
/*配置C/T2为CTR模式*/
TCNT2=0x00; //设初始值为0,
OCR2=255; //输出比较寄存器 //产生频率为1/[(OCR2+1)*4uS]
TCCR2|=_BV(WGM21)|_BV(CS21)|_BV(CS20); //C/T2中断,CTC模式,clk/64 产生周期 T=(OCR2+1)*(64/(2*8MHz))=(OCR2+1)*4uS
TIMSK|=_BV(OCIE2); //T/C2溢出中断使能
/*配置C/T1为快速PWM模式*/
//TCCR1A=_BV(COM1A1)|_BV(COM1A0)|_BV(WGM10); //比较匹配时,OCnA输出高电平,8位快速PWM,模式 5
TCCR1A=_BV(COM1A1)|_BV(WGM11)|_BV(WGM10); //比较匹配时,OCnA输出高电平,10位快速PWM,模式 5
TCCR1B=_BV(WGM12)|_BV(CS10); //无预分频,8MHz/1024=7.813KHz
TCNT1=0; //与OCR1A进行匹配的计数寄存器
SREG=0x80; //开总中断
DDRB|=_BV(PD5); //设PD5为PWM输出
while(1)
{
LCD_write_command(0x0c); //显示开
LCD_write_string(0,0,"Voltage"); //第1列,第0行,显示"Voltage"
uchar a[]="0123456789."; //要显示数放在a[]中
LCD_write_char(0,1,a[NO1]); //第0列,第1行,
LCD_write_char(1,1,a[10]); //第1列,第1行,
LCD_write_char(2,1,a[NO2]); //第2列,第1行,显示"."
LCD_write_char(3,1,a[NO3]); //第3列,第1行,
LCD_write_char(4,1,a[NO4]); //第4列,第1行,
/* delay time is 20ms*25=500ms */
for(i=1;i<1;i++)
//_delay_us(20); //The maximal possible delay is 768 us / F_CPU in MHz . 768us/8 =96us
_delay_ms(100); //The maximal possible delay is 262.14 ms / F_CPU in MHz. 262.14ms/8 =32.767ms
}
} |
|