搜索
bottom↓
回复: 3

ADC中断问题

[复制链接]

出0入0汤圆

发表于 2008-4-4 10:54:30 | 显示全部楼层 |阅读模式
#pragma interrupt_handler adc_isr:22
void adc_isr(void)
{
    unsigned char temp;          

        IDCBusSample = ADCL;
        temp = ADCH;
        IDCBusSample += (unsigned int)(temp << 8);
          
    IDCBusSum += IDCBusSample;
    IDCBus = IDCBusSum >> IDCBUS_FILT_INDEX;
    IDCBusSum -= IDCBus;
                     
    if(IDCBus > IDCBusMax)
    {
             nr_overcurrent++;
             if(nr_overcurrent > 3)
                 {
                          nr_overcurrent = 0;
                          FaultStatus = ERROR_OVERCURRENT;
             }
        }
    else
    {                     
             nr_overcurrent = 0;
        }
}

/*---          Get the ADC result         ---*/
unsigned int adc_result(unsigned char channel)
{
       unsigned int result;
           unsigned char temp;  
          
           //--- Select the AD channel ---
       ADMUX &= 0xe0;//default

           ADMUX += channel;                     
          
           //--- ADC start convertion ---
           ADCSRA += 0x40;

           temp = ADCSRA;
           while((temp & 0x40) == 0x40)
           {
               _NOP();
                   temp = ADCSRA;
           }                     
           result = 0;
           result += ADCL;
           temp = ADCH;
          
           result += (unsigned int)(temp << 8);                       
          
           return(result);             
}
/*---     Initialize the A/D converters    ---*/
void init_adc(void)
{
     //Select the ref volt and adc channel
     ADMUX += 1 << REFS0;   //AVCC with external capacitor at AREF pin.
         ADCSRA += 1 << ADPS2;  //Division factor : 64       
         ADCSRA += 1 << ADPS1;
         //ADCSRA += 1 << ADPS0;
         ADCSRA += 1 << ADATE;  //Auto triger
         ADCSRA += 1 << ADIF;
         ADCSRA += 1 << ADIE;   //Enable the adc         
         ADCSRB += 1 << ADTS2;  //Triger source: Timer0 overflow
         
         /*---      Enable ADC      ---*/
         ADCSRA |= 0x80;
}
我用了4个ADC管脚,想不同顺序的进行AD转换,我可以怎么做好呢? 按照我这样的写法,在MAIN()中调用的时候会中断掉。到底怎么样能做到有顺序的转换呢?请大家帮忙想想。

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2008-4-4 13:09:31 | 显示全部楼层
用CVAVR中的程序生成向导生成一ADC中断的程序框架,然后学习里面的处理方法.

出0入0汤圆

 楼主| 发表于 2008-4-4 13:45:23 | 显示全部楼层
谢谢machao,虽然我还没有解决,但是我知道问题在哪里!

出0入0汤圆

 楼主| 发表于 2008-4-8 09:54:30 | 显示全部楼层
已经解决了,在ADC中断中用switch语句选择通道就可以了。这个想法很不错的,调了很久才调通的。
现在把问题的答案发上来和大家分享下。
#pragma interrupt_handler adc_isr:22
void adc_isr(void)
{
       static unsigned char adc_state = 0;
       unsigned char temp;                     
          
          
           IDCBusSample = ADCL;
           temp = ADCH;
           IDCBusSample += (unsigned int)(temp << 8);
           ADMUX &= 0xe0;
          
           switch(adc_state)
           {
               case 0:
                IDCBusSum += IDCBusSample;
                IDCBus = IDCBusSum >> IDCBUS_FILT_INDEX;
                IDCBusSum -= IDCBus;
                               
                        if(IDCBus > IDCBusMax)
                        {                     
                                nr_overcurrent++;
                                if(nr_overcurrent > 3)
                                {
                                    nr_overcurrent = 0;
                                    FaultStatus = ERROR_OVERCURRENT;
                                }
                        }
                        else
                        {                     
                                nr_overcurrent = 0;
                        }       

                                //ADMUX &= 0xe0;
                                ADMUX += 1;
                                adc_state++;                  
                        break;
                   case 1:
                        TBottomBusSum += IDCBusSample;
                TBottomBus = TBottomBusSum >> TBOTTOMBUS_FILT_INDEX;
                TBottomBusSum -= TBottomBus;

                                  
                                ADMUX += 2;
                                adc_state++;                          
                        break;
                   case 2:
                        TTopBusSum += IDCBusSample;
                TTopBus = TTopBusSum >> TTOPBUS_FILT_INDEX;
                TTopBusSum -= TTopBus;
                               
                                ADMUX += 3;
                                adc_state++;                          
                        break;
                   case 3:
                        TBoilerBusSum += IDCBusSample;
                TBoilerBus = TBoilerBusSum >> TBOILERBUS_FILT_INDEX;
                TBoilerBusSum -= TBoilerBus;
                               

                                adc_state = 0;                          
                        break;
                   default:
                                adc_state = 0;                          
                        break;
           }                                   
}
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 23:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表