Atmega328 模数转换器

Posted

技术标签:

【中文标题】Atmega328 模数转换器【英文标题】:Atmega328 Analog-to-Digital Converter 【发布时间】:2018-08-08 19:42:59 【问题描述】:

我正在努力理解带有 arduino 和带有按钮的 LCD 屏的 ADC。我喜欢在 Atmel Studio 工作,并通过研究和数据表来编写自己的库。我的目标是将 ADC 值写入屏幕。如果我使用analogRead() 函数编写一个Arduino Sketch,它可以工作,但我无法使用我的Atmel Studio 程序读取LCDw 上的任何内容。 LCD 确实可以工作,因为我可以在 LCD 上写入其他信息。我的程序如下。任何想法都会有帮助。谢谢!!!

模拟标题

 #include<util/delay.h>

 void adc_init(void)
 
     ADMUX = (1<<REFS0);     //select AVCC as reference
     ADCSRA = (1<<ADEN) | 7;  //enable (ADEN) and prescale = 128 (16MHz/128 = 125kHz)
 

 int readAdc(char chan)
 
     ADMUX = (1<<REFS0) | (chan & 0x0f);  //select ref (REFS0) and channel
     ADCSRA |= (1<<ADSC);                 //start the conversion
     while (ADCSRA & (1<<ADSC));          //wait for end of conversion
     return ADC;                            //Return 16 Bit Reading Register
 

主程序

 #ifndef F_CPU
 #define F_CPU 16000000UL // 16 MHz clock speed
 #endif


 #define D4 eS_PORTD4
 #define D5 eS_PORTD5
 #define D6 eS_PORTD6
 #define D7 eS_PORTD7
 #define RS eS_PORTB0
 #define EN eS_PORTB1

 #include <avr/io.h>
 #include <util/delay.h>
 #include <stdio.h>
 #include "lcd328.h"
 #include "myHeader328.h"

 /*--------------------------------------------------------
 -- initScreen() initializes the screen
 --------------------------------------------------------*/
 void initScreen()
 
     Lcd4_Init();  //Initialize Screen
     Lcd4_Clear();  //Clear Screen
     Lcd4_Set_Cursor(1,0);
     Lcd4_Write_String("Count:0");
 

 /*--------------------------------------------------------
 -- refreshScreen() refreshed the screen
 --------------------------------------------------------*/
 void refreshScreen(int count2)
 
     char countStr[5];
     sprintf(countStr, "%i", count2);
     Lcd4_Set_Cursor(1,6);
     Lcd4_Write_String(countStr);
     _delay_ms(50);
 

 /*--------------------------------------------------------
 -- main()
 --------------------------------------------------------*/

 int main(void)
 
     DDRD = 0xFF;
     DDRB = 0xFF;
     DDRC = 0x00;
     initScreen();
     PORTB = PORTB | (1<<PORTB2);  //Turn on backlight
     int adcOut = 4;
     while(1)
     
         adcOut = readAdc(0);
         refreshScreen(adcOut);
         _delay_ms(500);

     
 

【问题讨论】:

【参考方案1】:

您必须在主循环中调用 adc_init()

/*--------------------------------------------------------
 -- main()
 --------------------------------------------------------*/

 int main(void)
 
     DDRD = 0xFF;
     DDRB = 0xFF;
     DDRC = 0x00;
     initScreen();
     adc_init();       //!!!!!
     PORTB = PORTB | (1<<PORTB2);  //Turn on backlight
     int adcOut = 4;
     while(1)
     
         adcOut = readAdc(0);
         refreshScreen(adcOut);
         _delay_ms(500);

     
 

【讨论】:

以上是关于Atmega328 模数转换器的主要内容,如果未能解决你的问题,请参考以下文章

328p芯片引脚间距

ATMEGA328P引脚定义图

使用 FTDI Basic 回读 ATmega328p 程序

atmega328p 单片机里面有自带蜂鸣器吗

增加ATMEGA328 实验电路板对外引脚

增加ATMEGA328 实验电路板对外引脚