打印
[AVR单片机]

求一个mega16单片机的对信号进行ad转换,并且将转换后的数据

[复制链接]
1240|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
631801386|  楼主 | 2013-11-13 16:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
airwill| | 2013-11-14 11:05 | 只看该作者
建议楼主找找开发板的例程资料, 自己琢磨,
遇到问题再来提问讨论, 不要做伸手党哦.

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
qin552011373 + 6 很给力!
板凳
qin552011373| | 2013-11-14 15:04 | 只看该作者
建议自己先写,有问题再来问

使用特权

评论回复
地板
631801386|  楼主 | 2013-11-14 15:19 | 只看该作者
qin552011373 发表于 2013-11-14 15:04
建议自己先写,有问题再来问

我自己写的程序大家帮我看看,我用uart读出的数据不对,大家看看程序那里有问题,使用gcc编译的,谢谢
#define BAUD  9600
#include<avr/io.h>
#include<util/delay.h>
#include<util/setbaud.h>
#include<avr/pgmspace.h>
#include<avr/interrupt.h>
#include <avr/signal.h>
#include<avr/interrupt.h>
#define  SETB_PB(x)  PORTB|=(1<<(x))
#define  CLR_PB(x)   PORTB&=~(1<<(x))
unsigned data_temp=0;
void Time0_OCR0Init()
{
    PORTB|=(1<<PB3);
        DDRB|=(1<<PB3);
    TCCR0|=(1<<WGM01)|(1<<CS00)|(1<<CS01)|(1<<COM00);//普通模式 64预分频ctc
    TIMSK|=(1<<OCIE0);
        OCR0=0x55;
    TCNT0=0X00;

}
void ADC_Init()
{
   

   ADMUX|=(1<<REFS0)|(1<<REFS1)|(1<<MUX0); //片内AVCC参考电压,单输入ADC0
   //ADMUX=0x00;
   ADCSRA= 0x00;
   //ADMUX =(1<<REFS0);
   ADCSRA|=(1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADATE );//中断使能,使能ADC 64分频
    SFIOR|=(1<<ADTS1)|(1<<ADTS0);//定时器、计数器比较匹配时触发源

}
unsigned ADC_Read()
{
   
           

     return(ADCL+(int)(ADCH<<8));

}
void Usart_Init(unsigned int baud)      //USART串口初始化
{
    UBRRH=UBRRH_VALUE;
    UBRRL=UBRRL_VALUE;  /*设置波特率*/
        UCSRB=(1<<RXEN)|(1<<TXEN);
        //UCSRC=(1<<URSEL)|(1<<UPM1)|(1<<UPM0)|(1<<UCSZ0)|(1<<UCSZ1);//(1<<UMSEL) 一位停止位;奇校验;8位;下降沿采样,上升沿改变数据;异步模
    UCSRC = ((1<<URSEL)|(3<<UCSZ0));
}

void  Usart_Send(unsigned char data)
{
   
   while(!(UCSRA&(1<<UDRE)));
   UDR=data;
}
void Usart_SendString(unsigned char *pcString)
{
        while (*pcString)
        {
          Usart_Send(*pcString++);   
        }
}
SIGNAL(SIG_ADC)              //AD转换器结束产生中断USART发送数据
{   
   // unsigned char tab[10]={0x00,0x01,0x02,0x03,
        //               0x04,0x05,0x06,0x07,
        //               0x08,0x09};
       
    unsigned  char i,j,m,n;
         ADCSRA |= (1 << ADIF);
    data_temp=ADC_Read();
       
   data_temp=(data_temp*2.56/1024*10);    //十进制输出
        i= data_temp/1000+0x30;
        j=data_temp%1000/100+0x30;
    m=data_temp%100/10+0x30;
    n=data_temp%10+0x30;
       Usart_Send(i);
       Usart_Send(j);
       Usart_Send(m);
       Usart_Send(n);
       Usart_Send(' ');

         // HD7279_DisplayDigital(7,tab,0);
    // HD7279_DisplayDigital(6,tab[j],0);
     // HD7279_DisplayDigital(5,tab[m],1);
          // HD7279_DisplayDigital(4,tab[n],0);
     _delay_ms(25);
   
}

int main()
{
   
  DDRA=0x00;
  SREG&=~0X80;
  Time0_OCR0Init();
  ADC_Init();
  Usart_Init(BAUD);
  SREG|=0X80;
ADCSRA |= (1 << ADSC);

  while(1)
  {
       ADCSRA |= (1 << ADSC);     //开始AD转换

  }

}

使用特权

评论回复
5
dqyubsh1| | 2013-11-14 19:36 | 只看该作者
1,先试串口,固定输出定长字符或者数字,看看有没有问题
2,试AD采样。用main主循环采集AD数据,不要用AD中断,ADC用查询方法,将采集结果串口发出,验证ADC正确性
3,最后做定时采样,ADC中断。这才是最难的部分。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
tooqng + 3 很给力!
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

39

帖子

0

粉丝