搜索
bottom↓
回复: 6

ATmega8的多通道AD转换问题,急!

[复制链接]

出0入0汤圆

发表于 2009-12-14 22:36:42 | 显示全部楼层 |阅读模式
想在12864上同时显示ad0和ad1的数值,但转换通道时出错,(单个转换时,可以用),应该怎么写的啊,哪位大侠帮帮忙,弄了几天了,都没弄清楚.....
/*
函数说明:12864串行驱动
注意事项:1,12864的串并选择硬件实现2,分界线以下的程序除初始化函数外没必要修改
作者:
时间:2009年7月18日
*/

#include<iom8v.h>
#include<macros.h>
#include"LCD12864.H"
#include"PWM.H"
#define uchar unsigned char
#define uint unsigned int
uchar js=0;
unsigned long ad,ad1,ad2;
unsigned long adc_dat[1];                      //AD转换 比较值存放数组
unsigned long adc_hc[1];                       //AD转换 缓冲存放数组

void dispaly(unsigned char address,unsigned long num)
{
         unsigned char a,b,c,d,e,f;
         write_com(address);
         a=num/100000+0x30;
         b=num%100000/10000+0x30;
         c=num%10000/1000+0x30;
         d=num%1000/100+0x30;
         e=num%100/10+0x30;
         f=num%10+0x30;
         write_data(a);
         msdelay(1);
         write_data(b);
         msdelay(1);
         write_data(c);
         msdelay(1);
         write_data(d);
         msdelay(1);
         write_data(e);
         msdelay(1);
         write_data(f);
         msdelay(1);
}


///ADC initialize
// Conversion time: 208uS
void init_adc(void)
{
DDRC|=(1<<PC0)|(1<<PC1)|(1<<PC2);                        //设置C口为输入,即ADC输入通道
PORTC&=~((1<<PC0)|(1<<PC1)|(1<<PC2));
      
ADCSRA=0X00;                      //在选择AD输入通道前关闭ADC转换的各个位
ADMUX|=(1<<REFS0)|(1<<REFS1);  //选择内部2.56v为基准电压,设置AD转换通道
ACSR|=(1<<ACD);  
ADCSRA=0X86;//单次转换 64分频
ADCSR|=(1<<ADSC)|(1<<ADIE);
}

//ADC完成中断
#pragma interrupt_handler adc_isr:15
void adc_isr(void)  
{
  unsigned long value;
  value=ADCL;            //Read 8 low bits first (important)
  value|=(uint)ADCH << 8;
  ad= value;
  ad=(ad*3040)/1023;
  ADCSRA|=(1<<ADSC);
}

void main(void)
{
uchar i;
unsigned long S1=123456,S2=555555,S3=222222;
CLI();
DDRD&=~BIT(3);
DDRD&=~BIT(4);
DDRD&=~BIT(7);
PORTD|=BIT(3)|BIT(4)|BIT(6);
lcd12864_init();
PWM_init();

SEI();
while(1)
{
init_adc();
ad1=ad;
dispaly(0x80,ad1);
ADCSRA&=~(1<<ADIE);                      //关中断
ADMUX|=(1<<REFS0)|(1<<REFS1)|(1<<MUX0);//改通道
ADCSRA|=(1<<ADIE);                      //开中断  
ad2=ad;
dispaly(0x90,ad2);
}
}

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2009-12-14 22:50:32 | 显示全部楼层
改通道 要放在ADC中断里面

出0入0汤圆

发表于 2009-12-14 22:52:20 | 显示全部楼层
void adc_isr(void)   
{  
  unsigned long value;
  value=ADCL;            //Read 8 low bits first (important)
  value|=(uint)ADCH << 8;
  ad= value;
  ad=(ad*3040)/1023;
  ADCSRA|=(1<<ADSC);  
}

加入
ADMUX++;
if(ADMUX==XX)
ADMUX=0;

出0入0汤圆

 楼主| 发表于 2009-12-15 16:16:49 | 显示全部楼层
想问一下二楼的思路是怎么样的呢,有点看不懂?
还有我下面我把“改通道”放到ADC中断里面了,有显示,但现在显示ad2是4069,最大不是1024吗,是不是我想错了?希望大侠们再帮帮忙。下面是改了之后的程序,只放上改了的程序。
//ADC完成中断
#pragma interrupt_handler adc_isr:15
void adc_isr(void)  
{
  unsigned long value;
  value=ADCL;            //Read 8 low bits first (important)
  value|=(uint)ADCH << 8;
  adc_dat[js]= value;
  js++;
   if(js==2)
      {
        js=0;
        ad1=adc_dat[0];
        ad2=adc_dat[1];  
      }
     switch (js)
       {
          case 0:
           ADCSRA&=~BIT(3);    //关中断
           ADMUX=0x60;         //转换通道
           ADCSRA|=BIT(3);     //开中断
           break;
          case 1:
           ADCSRA&=~BIT(3);
           ADMUX=0x61;
           ADCSRA|=BIT(3);
           break;
        }
                 ADCSRA|=(1<<ADSC);
}

void main(void)
{
uchar i;
unsigned long S1=123456,S2=555555,S3=222222;
CLI();
DDRD&=~BIT(3);
DDRD&=~BIT(4);
DDRD&=~BIT(7);
PORTD|=BIT(3)|BIT(4)|BIT(6);
lcd12864_init();
PWM_init();
init_adc();
SEI();
while(1)
{
dispaly(0x80,ad1);
dispaly(0x90,ad2);
}
}

出0入0汤圆

 楼主| 发表于 2009-12-15 16:19:08 | 显示全部楼层
上面是直接取adc的值,没有换成电压值了...

出0入0汤圆

 楼主| 发表于 2009-12-15 20:32:56 | 显示全部楼层
犯了个很简单的错误,ADMUX=0x60; 应该是ADMUX=0xc0的,换后就能显示了,真是不好意思啊....

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-6-12 00:15

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

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