




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
AD(模数)转换范例编写:阿莫(armok) / 代码设计:HJJourAVR / 2005-09-05 / www.OurAVR.com 1. 开发语言 本范例使用 WinAVR/GCC 20050214 版本开发2. 范例描述 本程序简单的示范了如何使用ATMEGA16的ADC模数转换器 普通的单端输入 差分输入及校准 基准电压的校准 查询方式 中断方式 数据格式的变换 出于简化程序考虑,各种数据没有对外输出,学习时建议使用JTAG ICE硬件仿真器3. 电路图设计 :为简化线路设计,使用了本网站的ATmega16功能小板。在范例中 选用内部2.56V电压基准作Vref ,差分通道 10倍放大则 单端电压测量范围 02.56V, 分辨率2.5mV 差分电压测量范围 +/- 256mV 分辨率0.5mV 电流分辨率 = 50uA10欧姆 电流采样电阻 电流分辨率 =500uA 1欧姆 电流采样电阻程序中需要把实测的基准电压代入 常量Vref中,以获得更准确地结果 我手中的样片实测为 2.556VVcc=5.0V 2.550VVcc=3.3V本电路仅供参考,没有考虑抗干扰方面的要求.4. 代码设计与说明 :/* AVR ADC使用范例 * * 作者: HJJourAVR * 编译器:WINAVR20050214 * 时钟: 内部RC 8MHz * * www.OurAVR.com 2006.4.30 */*本程序简单的示范了如何使用ATMEGA16的ADC模数转换器普通的单端输入差分输入及校准基准电压的校准查询方式中断方式数据格式的变换出于简化程序考虑,各种数据没有对外输出,学习时建议使用JTAG ICE硬件仿真器*/#include #include #include #include /*宏INTERRUPT 的用法与SIGNAL 类似,区别在于SIGNAL 执行时全局中断触发位被清除、其他中断被禁止INTERRUPT 执行时全局中断触发位被置位、其他中断可嵌套执另外avr-libc 提供两个API 函数用于置位和清零全局中断触发位,它们是经常用到的。分别是:void sei(void) 和void cli(void) 由interrupt.h定义 */管脚定义#define in_Single 0 /PA0(ADC0)#define in_Diff_P 3 /PA3(ADC3)#define in_Diff_N 2 /PA2(ADC2)/常量定义/单端通道,不放大#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/差分通道ADC0作负端,10/200倍放大#define AD_Diff0_0_10x 0x08 /ADC0+ ADC0-, 10倍放大,校准用#define AD_Diff1_0_10x 0x09 /ADC1+ ADC0-, 10倍放大#define AD_Diff0_0_200x 0x0A /ADC0+ ADC0-,200倍放大,校准用#define AD_Diff1_0_200x 0x0B /ADC1+ ADC0-,200倍放大/差分通道ADC2作负端,10/200倍放大#define AD_Diff2_2_10x 0x0C /ADC2+ ADC2-, 10倍放大,校准用#define AD_Diff3_2_10x 0x0D /ADC3+ ADC2-, 10倍放大#define AD_Diff2_2_200x 0x0E /ADC2+ ADC2-,200倍放大,校准用#define AD_Diff3_2_200x 0x0F /ADC3+ ADC2-,200倍放大/差分通道ADC1作负端,不放大#define AD_Diff0_1_1x 0x10 /ADC0+ ADC1-#define AD_Diff1_1_1x 0x11 /ADC1+ ADC1-,校准用#define AD_Diff2_1_1x 0x12 /ADC2+ ADC1-#define AD_Diff3_1_1x 0x13 /ADC3+ ADC1-#define AD_Diff4_1_1x 0x14 /ADC4+ ADC1-#define AD_Diff5_1_1x 0x15 /ADC5+ ADC1-#define AD_Diff6_1_1x 0x16 /ADC6+ ADC1-#define AD_Diff7_1_1x 0x17 /ADC7+ ADC1-/差分通道ADC2作负端,不放大#define AD_Diff0_2_1x 0x18 /ADC0+ ADC2-#define AD_Diff1_2_1x 0x19 /ADC1+ ADC2-#define AD_Diff2_2_1x 0x1A /ADC2+ ADC2-,校准用#define AD_Diff3_2_1x 0x1B /ADC3+ ADC2-#define AD_Diff4_2_1x 0x1C /ADC4+ ADC2-#define AD_Diff5_2_1x 0x1D /ADC5+ ADC2-/单端通道,不放大#define AD_SE_VBG 0x1E /VBG 内部能隙1.22V电压基准,校准用#define AD_SE_GND 0x1F /接地 校准用/注:/差分通道,如果使用1x或10x增益,可得到8位分辨率。如果使用200x增益,可得到7位分辨率。/在PDIP封装下的差分输入通道器件未经测试。只保证器件在TQFP与MLF封装下正常工作。#define Vref 2483 /mV 实测的Vref引脚电压5.0V供电/#define Vref 2464 /mV 实测的Vref引脚电压3.3V供电/全局变量unsigned int ADC_SingleEnded; /单端输入的ADC值int ADC_Diff; /差分输入的ADC值volatile unsigned int ADC_INT_SE; /中断模式用的单端输入ADC值,会在中断服务程序中被修改,须加volatile限定volatile unsigned char ADC_OK; /ADC状态,会在中断服务程序中被修改,须加volatile限定unsigned int LED_Volt; /变换后的电压mVint LED_Curr; /变换后的电流100uA/仿真时在watch窗口,监控这些全局变量。unsigned int read_adc(unsigned char adc_input)/查询方式读取ADC单端通道ADMUX=(0xc0|adc_input); /adc_input:单端通道 0x000x07,0x1E,0x1F/0xc0:选择内部2.56V参考电压ADCSRA|=(1ADSC); /启动AD转换loop_until_bit_is_set(ADCSRA,ADIF); /方法1 等待AD转换结束/ while (ADCSRA&(1ADIF)=0); /写法2 这种写法优化不好/ loop_until_bit_is_clear(ADCSRA,ADSC); /方法2 检测ADSC=0也行ADCSRA|=(1125uSADCSRA|=(1ADSC);loop_until_bit_is_set(ADCSRA,ADIF);ADCSRA|=(1ADIF);/当切换到差分增益通道,由于自动偏移抵消电路需要沉积时间,第一次转换结果准确率很低。用户最好舍弃第一次转换结果。ADCSRA|=(1ADSC);loop_until_bit_is_set(ADCSRA,ADIF);ADCSRA|=(1=0x0200) /负数要变换,正数不用ADC_FIX|=0xFC00; /变换成16位无符号整数return (int)ADC_FIX;SIGNAL(SIG_ADC) /ADC中断服务程序/硬件自动清除ADIF标志位ADC_INT_SE=ADC; /读取结果ADC_OK=1;int main(void)long temp32;ADC_SingleEnded =0;ADC_Diff=0;ADC_INT_SE=0;/上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻PORTB=0xFF; /不用的管脚使能内部上拉电阻。PORTC=0xFF;PORTD=0xFF;PORTA=(1in_Single)|(1in_Diff_P)|(1in_Diff_N); /作ADC输入时,不可使能内部上拉电阻。ADCSRA=(1ADEN)|0x06; /使能ADC,时钟64分频 125KHz8MHz system clocksei(); /使能全局中断while (1)/实测的Vref引脚电压 =2556mVADC_SingleEnded=read_adc(AD_SE_ADC0);/查询方式读取ADC0temp32=(long)ADC_SingleEnded*Vref;LED_Volt=(unsigned int)(temp32/1024);ADC_Diff =read_adc_diff(AD_Diff3_2_10x);ADC_Diff-=read_adc_diff(AD_Diff2_2_10x);/校准OFFSETtemp32=(long)ADC_Diff*Vref;LED_Curr=(unsigned int)(temp32/(512*10); /单位为100uA/查询方式读取ADC3+,ADC2- 10倍放大 max +/-255.6mV/10欧姆 1mA=10mV max +/-25.56mA/分辨率约0.5mV=50uA,显示取整为100uA单位ADCSRA|=(1ADIE); /使能ADC中断ADMUX=0xC0|AD_SE_ADC0; /单端输入ADC0ADC_OK=0; /软件标志清零
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑工程设计优化及技术咨询服务合同
- 观革命电影有感450字14篇
- 直接引语和间接引语的转换技巧:初中英语课程教案
- 纪检委员培训课件
- 人教版八年级英语上册Unit 5完形填空专题复习练习题(含答案解析)
- 唐诗三百首鉴赏与实践教学方案
- 工业园区招商合同
- 早教课件在家听
- 企业间知识产权保护与交易合作合同
- 纪念塔课件教学课件
- GB/T 242-2007金属管扩口试验方法
- 政治理论水平任职资格考试题库
- Unit 2 Lets celebrate Developing ideas-Writing a letter to express 课件【知识精讲+拓展训练】高中英语外研版(2019)必修第二册
- 路基压实度汇总表
- 【食品生产加工技术】香肠的加工技术
- 图标设计与制作PPT完整全套教学课件
- 贫困户访谈记录
- 道路喷雾降尘方案
- 唐恬人世间的孤勇者与追光者
- 数学基础模块上册课件
- 智慧羊场建设方案 智慧养殖监管系统解决方案
评论
0/150
提交评论