[Atmel] 固定时间间隔ADC采集数据问题求指导

[复制链接]
1318|4
 楼主| qazq123 发表于 2015-10-13 15:37 | 显示全部楼层 |阅读模式
本帖最后由 qazq123 于 2015-10-13 15:40 编辑
  1. //ADC初始化
  2. void adc_init(void)
  3. {

  4. ADCSRA = 0x00;
  5. ADMUX =0x46;//选择内部AVCC为基准
  6. ACSR  =(1<<ACD);//关闭模拟比较器
  7. ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//64分频
  8. }
  9. //定时器0初始化,定时625微妙,64分频
  10. void timer0_init(void)
  11. {
  12. TCCR0A = 0x00;   //正常端口操作,普通工作模式
  13. TCCR0B = 0x00;   //T/C不工作
  14. TCNT0 = 0xB2;    //TCNT0=178,即256-625/(1/(8/64))=178
  15. TIMSK0=0x01;     //T/C0中断屏蔽寄存器,T/C0溢出中断使能
  16. TCCR0B=0x03;       //64分频
  17. }
  18. //ADC完成中断
  19. #pragma interrupt_handler adc_isr:iv_ADC     
  20. void adc_isr(void)
  21. {
  22. temp=ADC&0x3ff;
  23. ADMUX =0x46;//选择内部AVCC为基准
  24. ADCSRA|=(1<<ADSC);//启动AD转换
  25. }
  26. #pragma interrupt_handler timer0_ovf:17
  27. void timer0_ovf(void)
  28. {
  29. TCNT0 = 0xB2;  //重装计数初值
  30. ADCSRA|=(1<<ADSC);//启动AD转换
  31. flag++;   //625微妙,标志位加1
  32. temp=(unsigned int)(((unsigned long)((unsigned long)temp*750*Vref))/0x3ff);
  33. temp_sum += temp;
  34. }
  1. //把计算出来的平均数给显示数组
  2. void shuju(void)
  3. {
  4. unsigned char i;
  5. for(i=0;i<4;i++)
  6.   {
  7.    
  8.    led_buff[i]=duan[temp_ave%10];
  9.    temp_ave=temp_ave/10;
  10.    }
  11.   led_buff[1]&=0x7f;
  12. }
  1.   //主函数里的循环
  2. while(1)
  3. {
  4.   //采集1600个点,进行数据平均数的计算
  5.   if(flag==1600)
  6.   {
  7.    temp_ave=(unsigned int)(temp_sum/1600);
  8.    flag = 0;
  9.    temp_sum = 0;
  10.   }
  11.    shuju();
  12.    for(j=0;j<20;j++)
  13.    {
  14.            display();
  15.    }
  16.    }

主芯片是mega48,求指导,没办法采集,本意的功能是:定时625微妙采集一次,1S采集1600个点,做平均数计算然后给显示数组。 但是不知道是定时器问题还是什么问题.求指导

ddllxxrr 发表于 2015-10-14 21:00 | 显示全部楼层
定时器只是初使化了,那么在哪里开始工作的????
 楼主| qazq123 发表于 2015-10-15 09:05 | 显示全部楼层
ddllxxrr 发表于 2015-10-14 21:00
定时器只是初使化了,那么在哪里开始工作的????

time0_ovf不是工作吗- - 初始化在上面的time0_init吧
ddllxxrr 发表于 2015-10-15 10:57 | 显示全部楼层
void timer0_init(void)
{
TCCR0A = 0x00;   //正常端口操作,普通工作模式
TCCR0B = 0x00;   //T/C不工作
TCNT0 = 0xB2;    //TCNT0=178,即256-625/(1/(8/64))=178
TIMSK0=0x01;     //T/C0中断屏蔽寄存器,T/C0溢出中断使能
TCCR0B=0x03;       //64分频
}

这里哪个是启动定时器了?????
 楼主| qazq123 发表于 2015-10-15 11:10 | 显示全部楼层
ddllxxrr 发表于 2015-10-15 10:57
void timer0_init(void)
{
TCCR0A = 0x00;   //正常端口操作,普通工作模式

#pragma interrupt_handler timer0_ovf:17
这个。 那个是初始化。我重新整理了一下,弄了另外一个帖子https://bbs.21ic.com/icview-1171768-1-1.html,你再看看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

163

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部