?? main.c
字號:
/***********************************************
**** AVR ADC使用范例 ***
**** ***
**** 策劃、整理與測試: 阿莫(armok) ***
**** 代碼編寫: HJJourAVR ***
**** 編譯器:WINAVR20050214 ***
**** ***
**** www.OurAVR.com 2005.8.30 ***
***********************************************/
/*
本程序簡單的示范了如何使用ATMEGA16的ADC模數轉換器
普通的單端輸入
差分輸入及校準
基準電壓的校準
查詢方式
中斷方式
數據格式的變換
出于簡化程序考慮,各種數據沒有對外輸出,學習時建議使用JTAG ICE硬件仿真器
*/
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <uart.c>
#include <stdio.h>
/*宏INTERRUPT 的用法與SIGNAL 類似,區別在于
SIGNAL 執行時全局中斷觸發位被清除、其他中斷被禁止
INTERRUPT 執行時全局中斷觸發位被置位、其他中斷可嵌套執
另外avr-libc 提供兩個API 函數用于置位和清零全局中斷觸發位,它們是經常用到的。
分別是:void sei(void) 和void cli(void) 由interrupt.h定義 */
//管腳定義
#define in_Single 0 //PF0(ADC0)
//常量定義
//單端通道,不放大
#define AD_SE_ADC0 0x00 //ADC0
#define AD_SE_ADC1 0x01 //ADC1
#define AD_SE_ADC2 0x02 //ADC2
#define AD_SE_ADC3 0x03 //ADC3
#define AD_SE_ADC4 0x04 //ADC4
#define AD_SE_ADC5 0x05 //ADC5
#define AD_SE_ADC6 0x06 //ADC6
#define AD_SE_ADC7 0x07 //ADC7
//單端通道,不放大
#define AD_SE_VBG 0x1E //VBG 內部能隙1.22V電壓基準,校準用
#define AD_SE_GND 0x1F //接地 校準用
#define Vref 3300 //mV 實測的Vref引腳電壓@5.0V供電
//#define Vref 2550 //mV 實測的Vref引腳電壓@3.3V供電
//全局變量
volatile unsigned int ADC_INT_SE; //中斷模式用的單端輸入ADC值,會在中斷服務程序中被修改,須加volatile限定
unsigned int LED_Volt; //變換后的電壓mV
//仿真時在watch窗口,監控這些全局變量。
void delay100ms(void)
{
int i,j;
for(j = 0;j<31;j++)
for(i = 0;i<2330;i++);//7.3728MHz的晶振
}
SIGNAL(SIG_ADC) //ADC中斷服務程序
{
//硬件自動清除ADIF標志位
ADC_INT_SE=ADC; //讀取結果
//實測的Vref引腳電壓 =2556mV
long temp32;
temp32=(long) ADC_INT_SE*Vref;
LED_Volt=(unsigned int)(temp32/1024);
uchar str[20];
delay100ms() ;
sprintf(str, "%4d mV ",LED_Volt);
USART_Transmit_str("Hello! 這是ADC轉換測試:\n");
USART_Transmit_str(str);
//delay100ms() ;
ADCSRA |= _BV(ADSC);
}
int main(void)
{
ADC_INT_SE=0;
USART_Init();
//上電默認DDRx=0x00,PORTx=0x00 輸入,無上拉電阻
PORTB=0xFF; //不用的管腳使能內部上拉電阻。
PORTC=0xFF;
PORTD=0xFF;
PORTF=~(1<<in_Single); //作ADC輸入時,不可使能內部上拉電阻。
ADMUX=0;
ADCSRA=_BV(ADEN)|_BV(ADSC)|_BV(ADIE)|_BV(ADPS2)|_BV(ADPS1); //使能ADC,時鐘64分頻 125KHz@8MHz system clock
sei(); //使能全局中斷
ADCSRA|=_BV(ADSC);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -