ATmega16进行多通道AD转换

合集下载

AD转换

AD转换

一、设置ADMUX(AD转换多路选择寄存器)1 参考电源的选择REFS1 REFS0 AREF引脚0 0 接外部参考电源(默认)0 1 内部接通AVCC,外部要求与GND之间并接电容(100nF)1 0 保留1 1 内部接通2.56V,外部要求与GND之间并接电容(100nF)2 对齐方式的选择ADLAR = 0: 右对齐(默认)转换结果如下:ADCH bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0内容 - - - - - - ADC9 ADC8ADCL bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0内容 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0ADLAR = 1: 左对齐(一般用于不需要大于8位精度时,只读ADCH就可以了)转换结果如下:ADCH bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0内容 ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2ADCL bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0内容 ADC1 ADC0 - - - - - -3 通道号的选择对于MEGA8:MUX3 MUX2 MUX1 MUX0 输入端0 0 0 0 ADC00 0 0 1 ADC10 0 1 0 ADC20 0 1 1 ADC30 1 0 0 ADC40 1 0 1 ADC50 1 1 0 ADC60 1 1 1 ADC71 1 1 0 内部1.22V1 1 1 1 内部0V对于MEGA16:关于差分输入可以通过选择MUX4...0设置放大倍数,因没有做过试验,此处略。

MUX4 MUX3 MUX2 MUX1 MUX0 输入端0 0 0 0 0 ADC00 0 0 0 1 ADC10 0 0 1 0 ADC20 0 0 1 1 ADC30 0 1 0 0 ADC40 0 1 0 1 ADC50 0 1 1 0 ADC60 0 1 1 1 ADC71 1 1 1 0 内部1.22V1 1 1 1 1 内部0V二设置ADCSRA1 转换模式选择对于MEGA8ADFR=1:首次启动转换后,将自动连续转换ADFR=0: 启动一次,转换一次对于MEGA16ADATE=1:首次启动转换后,在触发脉冲上升沿时开始一次转换 ADATE=0:启动一次,转换一次当ADATE=1后,启动转换前先要在SFIOR中设置触发源(当ADATE=0时,设置SFIOR是无效的):ADTS2 ADTS1 ADTS0 触发源0 0 0 自动连续转换0 0 1 模拟比较器0 1 0 外部中断00 1 1 定时器/计数器0比较匹配1 0 0 定时器/计数器0溢出1 0 1 定时器/计数器比较匹配B1 1 0 定时器/计数器1溢出1 1 1 定时器/计数器1捕获事件2 中断/查询方式选择ADIE=1: 转换完成后激活AD中断(当SREG的I位=1时)ADIE=0: 通过查询ADIF标志判断是否完成了一次转换ADIF=1,表示完成了一次转换。

ATmega16进行多通道AD转换

ATmega16进行多通道AD转换

AVR 进行多通道AD转换的设计例子模型AD中断采集完成后切换通道,这样AD触发用定时器触发或者连续采集模式都可以使用。

采样结果用一个数组存起来。

CODE://注意,得到的AD值并非实际的电压,而是0~1024(10位)或0~255(8位)。

#pragma interrupt_handler adc_isr:iv_ADCvoid adc_isr(void){//conversion complete, read value (int) using...#if AD_JINGDU ==10advalue=ADCL; //Read 8 low bits first (important)advalue|=(int)ADCH << 8; //read 2 high bits and shift into top byte#endif#if AD_JINGDU ==8advalue = ADCH;#endifif(SET_ADC==3) SET_ADC=0; //这是多路采集的一个思路SET_ADC++;AD_done=1; //转换完成标识位}[Copy to clipboard]CODE://ICC-AVR application builder : 2007-7-25 10:40:22// Target : M16// Crystal: 7.3728Mhz// 作者:古欣AVR与虚拟仪器[url][/url]// AD转换测试程序#include "config.h"volatile uint8 ADC_Value[]={0x00,0x00,0x00};void main(void){adc_init(SET_ADC); //启动AD,ADC0(PA0)输入DDRB = 0xff;while(1){if(AD_done==1) //AD转换完成标志位{AD_done=0;advalue=(advalue*5000)/1024;//AVCC的实际测得电压乘以1000代替5000,结果转化成了mv,后面的1024取决于#define AD_JINGDU 10,如果使用8位精度,则是256ADC_Value[SET_ADC]=advalue; //SET_ADC从0到2变化,采集三路电压值,存到ADC_Value[0],ADC_Value[1],ADC_Value[2],具体的存放,你自己完成吧//PORTB = advalue; //AD采样结果将在中断中存入advalue//show(ADget_vol();) //显示浮点的实际电压值}}}[Copy to clipboard]压缩包中附一个AD转换测试程序,在硬件上测试通过。

ATmega16之ADC

ATmega16之ADC

§2. A/D转换的基本概念
输入信号量程:指A/D转换器输入信号的最低和最高的电压。 输入信号如果超出范围,则会导致芯片的损坏。ATmega16的 输入信号量程是0-5V的直流电压信号。 基准电源: A/D转换器为量化输入的电压信号,在转换时必须 提供一个基准电压,及基准电源。基准电源的电压值决定可 以转换输入信号的最大值,所以一般等于输入信号的最大值。
ADTS2
初始值 0
ADTS1
0
ADTS0
0
0
位7~位5(ADTS2~ADTS0):ADC转换的触发源。具体的设置见下表:
ADTS2
0 0 0 0 1 1 1 1
ADTS1
0 0 1 1 0 0 1 1
ADTS0
0 1 0 1 0 1 0 1 自由转换模式 模拟比较器 外部中断源0
触发源
定时器/计数器0比较匹配 定时器/计数器0溢出 定时器/计数器比较匹配B 定时器/计数器1溢出 定时器/计数器1输入捕获
§4.2. A/D相关寄存器介绍
控制和状态寄存器-ADCSRA
位 N
0
ADSC
0
ADATE
0
ADIF
0
ADIE
0
ADPS2
0
ADPS1
0
ADPS0
0
位7(ADEN):ADEN = 1,即启动ADC,否则ADC功能关闭。在转换过程 中关闭 ADC将立即中止正在进行的转换。 位6(ADSC):ADC开始转换。 在单次转换模式下, ADSC 置位将启动一次 ADC 转换。 在连续转换模式下, ADSC 置位将启动首次转换。第一次转换 ( 在 ADC 启动之后置位 ADSC,或者在使能 ADC 的同时置位 ADSC) 需要 25 个 ADC 时钟周期,而不是正常情况下的 13 个。第一次转换执行 ADC初始化的工作。在转换进行过程中读取 ADSC 的返回值为 "1”, 直到转换结束。 ADSC 清零不产生任何动作。

实现ATmega16单片机AD键盘与PC机的串口通信并用LCD1602显示程序

实现ATmega16单片机AD键盘与PC机的串口通信并用LCD1602显示程序
平台ATmega16
编程软件CodeVisionAV
实现功能:单片机与PC机(电脑)之间的串口通信。具体就是单片机最小系统上的AD键盘按键按下后发送键值到串口助手上显示,串口助手发送一串字符到最小系统上的lcd1602显示。
(程序或有冗余)
#include <mega16.h>
#include <delay.h>
data=rx_buffer[rx_rd_index]; //读取缓冲队列中的数据
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli") //关中断
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
// USART Receiver buffer:接收器缓冲
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif

Atmega16模拟转换

Atmega16模拟转换

例[7-2] 测量与显示PA0引脚上的电压。
输入电压由电位器取5V的分压。电压变化在 0~5V之间,电压大小可滑动电位器来改变。采 用8次平均滤波和一阶滞后滤波。最程变换为: Y=K*X。
程序清单 #include “mega16.h” #include “delay.h” #include “math.h” #include “C:\cvavr\p_dkj\spi_7219.c” float lb,bl; int dy; int zhuanhuan(char tongdaohao) { ADCSRA=0x86 ; •ADMUX=0x40+ tongdaohao ; ADCSRA.6=1 ; while(!ADCSRA.4) ; return ADCW; }
信号滤波 量程变换
信号滤波
在模拟量测量中,因为有噪声干扰和其它干扰, 转换的数据会出现跳变,使显示的数据不稳定。 为了消除干扰,在硬件通道中要加入滤波电路, 在软件中需要采用滤波技术消除干扰。滤波的 方法有很多,这里介绍两种常见的滤波方法。
平均滤波:对一个参数进行连续的多次采样, 然后取其平均值。因为是在很短的时间内进行 的多次采样,对消除高频干扰是较有效的。 一阶滞后滤波:设上个采样周期的测量结果为 Yn-1,本次转换值为xn,滤波系数为α, 0<=α<1,本次的测量结果为Yn,则Yn=α×Yn1+(1-α)×xn。α越大,滤波作用越强。
量程变换
转换的数字与输入的被测量不同,如果直接显示 转换值,将与被测量的信号对应不上,要进行量 程变换。 例如:用某一通道测量温度,当温度为0时,其电 压值为1V;温度为100时,电压值为5V。而通道 经校准,在5V时的转换值为1000,1V时的转换值 为200。为了准确的显示温度值,应按下式进行变 换 Y=100*(X-200)/(1000-200) 式中,X为A/D转换后的值,Y为显示值,上式按 线性比例推算而出。

ADC实验 ATmega16

ADC实验 ATmega16

6.2模数转换的ADC实验 6.2.1、实例功能AVR的模数转换器ADC具有下列特点:110位精度;20.5LSB积分非线形误差3±2LSB的绝对精度;413µs~260µs的转换时间;5在最大精度下可达到每秒15kSPS的采样速率;68路可选的单端输入通道;77路差分输入通道;82路差分输入通道带有可选的10×和200×增益;9ADC转换结果的读取可设置为左端对齐(LEFT ADJUSTMENT);10ADC的电压输入范围0~Vcc;11可选择的内部2.56V的ADC参考电压源;12自由连续转换模式和单次转换模式;13ADC自动转换触发模式选择;14ADC转换完成中断;15休眠模式下的噪声抑制器(NOISE CANCELER)。

在本实例中,我们将编写程序实现将模数转换后获得的电压值通过单片机的串口发送到计算机,然后通过计算机上的串口助手显示测量的电压值。

本实例共有3个功能模块,分别描述如下:●单片机系统:使用单片机的串口实现将模数转换后获得的电压值通过串口发送到计算机。

●外围电路:RS232电平转换电路,DB9串行接口插座,模拟电压输入采集电路。

●软件程序:进一步熟悉单片机的串行通信,并掌握单片机的模数转换的方法。

6.2.2、器件和原理关于串行接口的原理已接单片机与计算机的串口的连接在上一实例中进行了描述,在本实例中不再重复。

本实例只介绍ATmega16单片机如何通过内置的模数转换模块采集外界输入的模拟电压。

1、ATmega16单片机的模数转换器ADC介绍由于单片机只能处理数字信号,所以外部的模拟信号量需要转变成数字量才能进一步的由单片机进行处理。

ATmega16内部集成有一个10位逐次比较(successive approximation)ADC电路。

因此使用AVR可以非常方便的处理输入的模拟信号量。

ATmega16的ADC与一个8通道的模拟多路选择器连接,能够对以PORTA作为ADC输入引脚的8路单端模拟输入电压进行采样,单端电压输入以0V(GND)为参考。

基于ATmega16的AD7705多通道模拟量采集系统设计

基于ATmega16的AD7705多通道模拟量采集系统设计

D R - P 3 串行 数据 输 入端 D N P 5 串行 数 R Y B、 I— B 、
据 输 出端 D U - P 6和 串行 时钟 S L - P 7 O T B CK B。

其导 通 断 开 通 过 P P三 极 管 Q N 1驱 动 , 制 控
信号 为 T 0 二极 管 D D , 1起 续 流 作 用 , 护 电 路 正 保 常工作 同时具有 抑 制尖 峰 干 扰 作用 。通 道 1~3 1 的选择 电路 类 似 , 同理 设 计 模 拟 信 号 输 入 A l~ l
T C 1 = O 0 ; / 动 定 时 器 ,5 CR B x4 / 启 2 6分 频 T M K l BT T I 1 ; / 能 溢 出 中断 IS _ I(OE ) /使 }
定 时器 1溢 出中断 函数 :
v d tme l o f i ( o ) oi i r v s vi r d
w i !(PR & ( hl e( SS 1< <S I ) ) / 待 传 输 PF ) / 等
结 束
} 读 出 A 70 D 7 5数 据 函 数 , 回 值 为 读 出 的 2字 节 数 返
据:
u sg e n d 7 0 vi ) n in d itr_ 7 5( od
T N 1 = 0 3 ; / 时器 1 出 时 间 2 m C TL xB /定 溢 0 s
v i od wr 7 0 ( n i e h r aa 7 5 u s n d c a d t) g
_ _
完成 , 以读 取 ; 2种 是 查 询 通 信 寄 存 器 中 的 可 第 DD R Y位 , 果是 0表示 可 以读 取数 据 : 如
定时器 1 始化 函数 : 初

Atmega16单片机介绍

Atmega16单片机介绍

Atmega16单片机介绍ATmega16是基于增强的AVR RISC结构的低功耗8 位CMOS微控制器。

由于其先进的指令集以及单时钟周期指令执行时间,ATmega16 的数据吞吐率高达1 MIPS/MHz,从而可以缓减系统在功耗和处理速度之间的矛盾。

ATmega16 AVR 内核具有丰富的指令集和32 个通用工作寄存器。

所有的寄存器都直接与算逻单元(ALU) 相连接,使得一条指令可以在一个时钟周期内同时访问两个独立的寄存器。

这种结构大大提高了代码效率,并且具有比普通的CISC 微控制器最高至10 倍的数据吞吐率。

ATmega16 有如下特点:16K字节的系统内可编程Flash(具有同时读写的能力,即RWW),512 字节EEPROM,1K 字节SRAM,32 个通用I/O 口线,32 个通用工作寄存器,用于边界扫描的JTAG 接口,支持片内调试与编程,三个具有比较模式的灵活的定时器/ 计数器(T/ C),片内/外中断,可编程串行USART,有起始条件检测器的通用串行接口,8路10位具有可选差分输入级可编程增益(TQFP 封装) 的ADC ,具有片内振荡器的可编程看门狗定时器,一个SPI 串行端口,以及六个可以通过软件进行选择的省电模式。

工作于空闲模式时CPU 停止工作,而USART、两线接口、A/D 转换器、SRAM、T/C、SPI 端口以及中断系统继续工作;掉电模式时晶体振荡器停止振荡,所有功能除了中断和硬件复位之外都停止工作;在省电模式下,异步定时器继续运行,允许用户保持一个时间基准,而其余功能模块处于休眠状态;ADC 噪声抑制模式时终止CPU 和除了异步定时器与ADC 以外所有I/O 模块的工作,以降低ADC 转换时的开关噪声;Standby 模式下只有晶体或谐振振荡器运行,其余功能模块处于休眠状态,使得器件只消耗极少的电流,同时具有快速启动能力;扩展Standby 模式下则允许振荡器和异步定时器继续工作。

AVR单片机学习十ATmega16ADC

AVR单片机学习十ATmega16ADC

AVR 单片机学习(十)ATmega16 ADC 模数转换技术概述性能指标:速度与精度AVR 的模数转换器转换速率:每秒钟采样的次数。

常用单位: SPS(每秒次) KSPS(每秒千次) MSPS(每秒百万次)。

越快越好。

转换精度:转换结果的有效位数(二进制)。

单位:位AVR的片上ADC:最高转换速率:15kSPS最高转换精度:10位AVR片上ADC的特点:10 位精度0.5 LSB 的非线性度± 2 LSB 的绝对精度65 - 260 μs 的转换时间最高分辨率时采样率高达15 kSPS8 路复用的单端输入通道7 路差分输入通道2 路可选增益为10x 与200x 的差分输入通道可选的左对齐ADC 读数0 - VCC 的 ADC 输入电压范围可选的2.56V ADC 参考电压连续转换或单次转换模式通过自动触发中断源启动ADC 转换ADC 转换结束中断基于睡眠模式的噪声抑制器使用流程:1.初始化相关寄存器2.读取转换结果3.平滑滤波4.进行单位制变换转换结果默认是右对齐的。

所以高6位是补0的。

电压增益一般用不到。

相关寄存器第一个寄存器:ADMUX这个是多工选择寄存器,ADMUX 7 6是参考电压源选择,有表一般AVCC不稳定所以一般不用一般用 1 1内部2.56V第5位:是转换结果左对齐默认是右对齐左对齐就是放在高10位低6位是补0的。

一般左对齐应用场合是只需要8位的精度,就左对齐取出高半个字节就支取了8位精度。

第4位:模拟通道与增益选择位有个列表不同的组合和增益,而我们现在只需要单端输入所以都设置为0.第2个寄存器:ADC 控制与状态寄存器第7位:ADC 使能 ADEN 置位就启动ADC第6位:ADC 开始转换,启动ADC开始进行转换第5位:自动触发使能,很多时候需要循环采样模拟信号,自动触发采样很有用的,比如,用定时器100MS 采样一次。

触发源下面会有讲。

第4位:ADC中断标志。

转换结束之后这个位会置位,第3位:ADC 中断使能第2:0位:预分频选择位是因为它需要一个时钟看那前面转换时序图194页下图有个表可以晶振时钟 2分频到128分频。

ATmega16之AD转换与ADC中断程序

ATmega16之AD转换与ADC中断程序
11
1、ATmega16内部ADC特点
12
2、模拟噪声抑制技术
• 设备内部及外部的数字电路都会产生电磁 干扰(EMI),从而影响模拟测量的精度。如 果转换精度要求较高,那么可以通过以下 方法来减少噪声:
- 1. 模拟通路越短越好。保证模拟信号线位于模拟地之上 ,并使它们与高速切换的数字信号线分开。 - 2. AVCC 应通过 LC 网络与数字电压源 VCC 连接。 - 3. 使用 ADC 噪声抑制器来降低来自 CPU 的干扰噪声。 - 4. 如果有其他 ADC 端口被用作数字输出,那么必须保 证在转换进行过程中它们不会有电平的切换。
39
• 平均滤波:对一个参数进行连续的多次采样,然后取其平 均值。因为是在很短的时间内进行的多次采样,对消除高 频干扰是较有效的。
• 一阶滞后滤波:设上个采样周期的测量结果为Yn-1,本次 转换值为xn,滤波系数为α,0<=α<1,本次的测量结果为 Yn,则Yn=α×Yn-1+(1-α)×xn。α越大,滤波作用越强。
36
SFIOR
4、ADC及相关寄存器
• 中断寄存器 - SREG
- Bit 7 – I: 全局中断使能
I 置位时使能全局中断。单独的中断使能由其他独立的控制寄存器控制 。如果 I 清零,则不论单独中断标志置位与否,都不会产生中断。任意一个 中断发生后 I 清零,而执行 RETI 指令后 I 恢复置位以使能中断。I 也可以通 过 SEI 和 CLI 指令来置位和清零。
ADPS1 0 0 1 1 0 0 1 1
ADPS1 0 1 0 1 0 1 0 1
分频因子 2 2 4 8 16 32 64
128
28
ADCL 及 ADCH

ATmega16单片机的使用

ATmega16单片机的使用

ATmega16单片机的使用——实验一 Atmega16定时器T/C0实现按键扫描——实验二 ATmega16单片机的ADC使用举例指导老师:黄刚班级:0720222姓名:李锋锐学号:28试验《一》 Atmega16定时器T/C0实现按键扫描(一)实验目的:用ATmega16实现同时对两个按键定时扫描,要求扫描周期为10MS ,当AJ1按下,LED2点亮,并且BELL 蜂鸣声,当AJ1松开,LED2熄灭,BELL 不响;当AJ2按下,LED3点亮,并且BELL 发出蜂鸣声,当AJ2松开,LED3熄灭,BELL 不响。

(二)实验原理(硬件设计):如图5-37所示,端口PD.3、PD.4为输入端,分别接AJ1和AJ2;端口PD.6、PD.7为输出模式,分别接LED2和LED3;端口PA.4为输出,通过三极管T1来控制蜂鸣器。

图5-36 基于Atmega16单片机定时器的按键扫描电路图(三)实验原理(软件设计):选用外部7.3728MHz 的晶振为系统时钟,按键扫描间隔定位10ms ,定时器T/C0采用CTC 模式,T/C0时钟选择1024分频后的系统时钟,并启用中断。

利用CTC 模式的工作原理,OCR0应赋的值由以下方程确定:361010)10(1024103728.71-⨯=+⨯⨯⨯OCR 于是:)(即0x47710=OCR 。

允许比较匹配中断,在中断程序里做标志位设置,判断标志位满足条件时,程序再读取键盘的状态,确定有无键按下以及按下键的具体操作。

程序如下:(1) L5-6.c#include<iom16.h> #include"key.h"#define Led2 PORTD_Bit6//定义led2 #define Led3 PORTD_Bit7//定义led3 #define Bell PORTA_Bit4//定义bell unsigned char flag=0;void port_init(void);void timer0_init(void);//************************主程序****************************//void main(void){port_init();timer0_init();SREG_Bit7=1;//使能全局中断TCCR0=0x0D;// 定时器工作模式为CTC模式,定时器时钟源来自预分频器的1024分频 while(1){if(flag==1){flag=0;switch(read_key()){case 0:Led2 =1; // Led2灯不亮Led3=1; //Led3灯不亮Bell =0; //蜂鸣器不响break;case 1:Led2 =0; //led2灯亮Led3=1; //Led3灯不亮Bell =1; //蜂鸣器响break;case 2:Led2 =1; //led2灯不亮Led3=0; //Led3灯亮Bell =1; //蜂鸣器响break;}}}}//*******************端口初始化程序*****************************//void port_init(void){DDRD=0xc0;PORTD=0x18;//PD.3( AJ1 )和PD.4( AJ12)方向输入,上拉有效,PD.6(Led2)和//PD.7(Led3)方向输出DDRA=0x10;PORTA=0x00;//PA.4(Bell)方向输出}//******************定时器寄存器初始化程序*(***********************//void timer0_init(void){TCCR0=0x00;TCNT0=0x00;OCR0=0x47; //7.3728MHz的系统时钟(OCR0=0X48)10msTIMSK=0x02; //TC0比较匹配中断使能}//******************定时器0比较匹配中断服务程序***********************// #pragma vector=TIMER0_COMP_vect__interrupt void TIMER0_COMP_isr(void){SREG_Bit7=0;//关闭全局中断flag=1; //标志位置位SREG_Bit7=1; //打开全局中断}(2) key.h#include<iom16.h>#define AJ1 PIND_Bit3//定义按键1#define AJ2 PIND_Bit4//定义按键2unsigned char read_key(){static unsigned char key_state=0;unsigned char key_return=0;switch((key_state)){case 0:if(!AJ1||!AJ2){key_state=1;}break;case 1:if(!AJ1||!AJ2){switch((PIND&0x18)){case 0x10://AJ1按下,返回1key_return=1;break;case 0x08://AJ2按下,返回2key_return=2;break;}key_state=2;}else{key_state=0;}break;case 2:if(AJ1&&AJ2){key_state=0;}if(!AJ1){key_return=1;}if(!AJ2){key_return=2;}break;default: break;}return ( key_return);}四、实验结果:ATmega16可实现同时对两个按键定时扫描,扫描周期为10MS,当AJ1按下,LED2点亮,并且BELL蜂鸣声,当AJ1松开,LED2熄灭,BELL不响;当AJ2按下,LED3点亮,并且BELL发出蜂鸣声,当AJ2松开,LED3熄灭,BELL不响。

基于ATmega16的多路KVM切换器设计及应用

基于ATmega16的多路KVM切换器设计及应用

基于ATmega16的多路KVM切换器设计及应用夏海明;曹建【摘要】为了提高管理人员的工作效率,节省机房空间,节能降耗,降低成本,设计一种基于ATmega16的多路KVM切换器.系统采用ATmega16作为主控制器,利用三极管导通特性切换R、G、B模拟信号,通过电子开关切换PS2信号和VGA的数字信号.KVM切换器实现了对多台PC机的控制.通过4路切换器的实验表明,该设计不仅能够保证切换时视频的图像清晰度、鼠标及键盘的灵敏度、电路稳定性,而且体积小、功耗低、成本低、易于功能扩展.【期刊名称】《计算机应用与软件》【年(卷),期】2012(000)011【总页数】3页(P229-231)【关键词】ATmega16;电子开关;KVM;切换【作者】夏海明;曹建【作者单位】中南大学物理与电子学院湖南长沙410083;中南大学物理与电子学院湖南长沙410083【正文语种】中文【中图分类】TP2710 引言KVM[1-3]是键盘、显示器、鼠标的缩写。

KVM 切换器用于实现显示器、键盘、鼠标重用,节约成本,提高工作效率[4-6]。

多路KVM切换器即是采用一套KVM控制多台电脑,实现对设备的集中可靠管理,提高管理人员的工作效率,节省机房空间,节能降耗。

目前,大部分公司所使用的是采用继电器实现的机械式切换器,寿命短,不适合长期使用[7,8];也有些公司利用视频切换芯片[9]来设计,虽然视频图像清晰,但成本相对较高,不利于批量生产。

为了改进这些缺点,本设计利用HC244、HCF4053等电子开关结合三极管的导通特性来设计KVM切换模块,具有高性能、高可靠性、低成本、低功耗等优点。

1 系统概述如图1所示,系统由ATmega16控制模块、本地控制设备、本地PC机群、KVM 信号切换模块、按键切换电路、切换指示电路和测试逻辑模块组成。

为了减小信号传输的干扰性,把KVM信号切换模块分为视频信号切换和PS2信号切换。

本地控制设备由一套显示器、键盘、鼠标等外设组成;本地PC机群由多台PC主机组成。

AVR教程系列一(6):ATmega16 简介(一)

AVR教程系列一(6):ATmega16 简介(一)

ATmega16 简介ATmega16是基于增强的AVR RISC结构的低功耗8 位CMOS微控制器。

由于其先进的指令集以及单时钟周期指令执行时间,ATmega16 的数据吞吐率高达1 MIPS/MHz,从而可以缓减系统在功耗和处理速度之间的矛盾。

ATmega16 AVR 内核具有丰富的指令集和32 个通用工作寄存器。

所有的寄存器都直接与算逻单元(ALU) 相连接,使得一条指令可以在一个时钟周期内同时访问两个独立的寄存器。

这种结构大大提高了代码效率,并且具有比普通的CISC 微控制器最高至10 倍的数据吞吐率。

ATmega16 有如下特点:16K字节的系统内可编程Flash(具有同时读写的能力,即RWW),512 字节EEPROM,1K 字节SRAM,32 个通用I/O 口线,32 个通用工作寄存器,用于边界扫描的JTAG 接口,支持片内调试与编程,三个具有比较模式的灵活的定时器/ 计数器(T/C),片内/外中断,可编程串行USART,有起始条件检测器的通用串行接口,8路10位具有可选差分输入级可编程增益(TQFP 封装) 的ADC ,具有片内振荡器的可编程看门狗定时器,一个SPI 串行端口,以及六个可以通过软件进行选择的省电模式。

工作于空闲模式时CPU 停止工作,而USART、两线接口、A/D 转换器、SRAM、T/C、SPI 端口以及中断系统继续工作;掉电模式时晶体振荡器停止振荡,所有功能除了中断和硬件复位之外都停止工作;在省电模式下,异步定时器继续运行,允许用户保持一个时间基准,而其余功能模块处于休眠状态; ADC 噪声抑制模式时终止CPU 和除了异步定时器与ADC 以外所有I/O 模块的工作,以降低ADC 转换时的开关噪声; Standby 模式下只有晶体或谐振振荡器运行,其余功能模块处于休眠状态,使得器件只消耗极少的电流,同时具有快速启动能力;扩展Standby 模式下则允许振荡器和异步定时器继续工作。

Atmega16端口的第二功能

Atmega16端口的第二功能

端口A端口B引脚配置如下:•SCK –端口B, Bit 7SCK:SPI 通道的主机时钟输出,从机时钟输入端口。

工作于从机模式时,不论 DDB7 设置如何,这个引脚都将设置为输入。

工作于主机模式时,这个引脚的数据方向由DDB7 控制。

设置为输入后,上拉电阻由PORTB7控制。

•MISO –端口 B, Bit 6MISO:SPI 通道的主机数据输入,从机数据输出端口。

工作于主机模式时,不论DDB6 设置如何,这个引脚都将设置为输入。

工作于从机模式时,这个引脚的数据方向由DDB6 控制。

设置为输入后,上拉电阻由PORTB6控制。

•MOSI –端口 B, Bit 5MOSI: SPI 通道的主机数据输出,从机数据输入端口。

工作于从机模式时,不论DDB5 设置如何,这个引脚都将设置为输入。

当工作于主机模式时,这个引脚的数据方向由 DDB5控制。

设置为输入后,上拉电阻由PORTB5控制。

•SS –端口 B, Bit 4SS: 从机选择输入。

工作于从机模式时,不论DDB4 设置如何,这个引脚都将设置为输入。

当此引脚为低时SPI 被激活。

工作于主机模式时,这个引脚的数据方向由DDB4 控制。

设置为输入后,上拉电阻由PORTB4控制。

• AIN1/OC0 –端口 B, Bit 3AIN1,模拟比较负输入。

配置该引脚为输入时,切断内部上拉电阻,防止数字端口功能与模拟比较器功能相冲突。

OC0,输出比较匹配输出:PB3 引脚可作为T/C0比较匹配的外部输出。

实现该功能时,PB3 引脚必须配置为输出( 设DDB3 为1) 。

在 PWM模式的定时功能中, OC0 引脚作为输出。

• AIN0/INT2 –端口 B, Bit 2AIN0,模拟比较正输入。

配置该引脚为输入时,切断内部上拉电阻,防止数字端口功能与模拟比较器功能相冲突。

INT2,外部中断源 2 : PB2 引脚作为MCU的外部中断源。

• T1 –端口B, Bit 1T1, T/C1 计数器源。

ATMAGE16内部ADC的使用程序

ATMAGE16内部ADC的使用程序

ATMAGE16内部ADC的使用程序程序说明:本例程是控制ATMAGE16内部的AD进行转换,然后将转换结果转换成电压,显示到数码管上。

本人刚开始用A VR这是写的第一个程序,可能思路上会有很多问题,忘个位网友看后指出,我的邮箱是462511238@欢迎和我交流。

写这个程序的目的是为了用AD采集一个模拟量,在网上看了些历程,很多都是用查询发写的。

就是启动ADC转换以后,等待ADC转换完成,然后就将数据读出,显示出来。

这种程序也就只能自己玩玩,毫无实用价值。

因为在实际产品中,会有很多干扰信号,采集一次就显示,得到的数据往往是干扰信号。

要消除这些干扰,需要在ADC的输入通道上加上滤波电容,当然更重要的是在程序中进行处理。

这也就是所谓的数字滤波了,由于单片机运算能力有限,很多PC上的一些算法对于单片机来说就过于复杂了。

我在这个程序中,只是采用多次采集数据,然后求平均值的算法进行最简单的滤波的,但这在要求不高的场合已经能够满足要求了。

采用查询法,一直查询ADC是否转换结束是非常浪费CPU时间的。

因此我们需要开启ADC的中断,但是每隔多久进行一次转换呢,一直都不停的转换,其实对我们得到准确的数据意义不大,(我采集的是桥式应变片经过差分放大的信号)。

并且数据刷新太快,用于显示,会给人不稳定的感觉,还没看清楚显示的是什么,就又刷新了。

由于A VR的ADC可以用定时的溢出来触发转换。

于是我想到,用定时器来定时,每隔0.1S采集一次,1S 刷新一次显示,也就是每次显示的数据是采集十次数据的平均值,这样做出来还是比较稳定的。

程序实现思路:将ATMAGE16的定时器1设置为普通计数模式,并且将时钟256分频作为定时器1的工作脉冲(我采用的是4MHZ晶振)。

然后将ADC设置为定时器1溢出触发,当定时器溢出后,将触发ADC转换,ADC转换完成后,进入ADC中断,读取数据,并对定时器进行重装初值。

这样,就可以保证,每次进行ADC转换的间隔时间基本是一样的。

CLOUD AVR 自学资料 Mega16 ADC

CLOUD AVR 自学资料  Mega16 ADC

CLOUD A VR 自学资料Mega16 ADCBy_Cloud一、首先看介绍一下官方数据手册给出的ATMEGA16的ADC特性参数:•10位精度•可选的左对齐ADC读数•0.5 LSB 的非线性度•0 - VCC的ADC输入电压范围•± 2 LSB 的绝对精度•可选的2.56V ADC参考电压•65 - 260 µs的转换时间•连续转换或单次转换模式•最高分辨率时采样率高达15 kSPS •通过自动触发中断源启动ADC转换•8 路复用的单端输入通道•ADC转换结束中断•7 路差分输入通道•基于睡眠模式的噪声抑制器•2 路可选增益为10x 与200x 的差分输入通道二、下面是相关寄存器的设置说明:1、ADMUX寄存器配置:ADMUX(数模转换多路复用选择寄存器)7 6 5 4 3 2 1 0REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0 ·7-REFS1:0-使用A VCC作为参考电平1-使用内部2.56V参考电平·6-REFS0:0-使用外部AREF管脚作为参考电平,7设置无效1-使用7的设置这里注意,不使用外部AREF管脚作为参考电平时候,AREF要用电容接地去耦。

·5-ADLAR:0-AD转换结果右对齐1-左对齐·4~0-MUXx:用来设置选择通道/增益放大系数/差分放大等参数。

当4和3清零时,AD输入为单端输入模式,通道数就是MUX0~2,更多详细设置见下表:MUX4..0 单端输入正相差分输入反相差分输入增益00000 ADC0 N/A00001 ADC100010 ADC200011 ADC300100 ADC400101 ADC500110 ADC600111 ADC701000 N/A ADC0 ADC0 10X01001 ADC1 ADC0 10X01010 ADC0 ADC0 200X01011 ADC1 ADC0 200X01100 ADC2 ADC2 10X01101 ADC3 ADC2 10X01110 ADC2 ADC2 200X01111 ADC3 ADC2 200X10000 ADC0 ADC1 1X10001 ADC1 ADC1 1X10010 ADC2 ADC1 1X10011 ADC3 ADC1 1X10100 ADC4 ADC1 1X10101 ADC5 ADC1 1X10110 ADC6 ADC1 1X10111 ADC7 ADC1 1X11000 ADC0 ADC2 1X11001 ADC1 ADC2 1X11010 ADC2 ADC2 1X11011 ADC3 ADC2 1X11100 ADC4 ADC2 1X11101 ADC5 ADC2 1X11110 1.22V(V BG)11111 0V(GND)2、ADCSRA数模转换控制盒状态寄存器:ADCSRA(数模转换控制盒状态寄存器)7 6 5 4 3 2 1 0ADEN ADSC ADA TE ADIF ADIE ADPS2 ADPS1 ADPS0 ·7-ADEN:0-关闭AD转换(转换过程中关闭ADC将立即中止正在进行的转换)1-开启AD转换,ADC使能·6-ADSC:0-当前未在转换(由硬件自动清零)1-启动单次转换(转换过程中一直为1)·5-ADATE:0-不自动触发1-自动触发使能,触发信号的上边沿启动ADC转换。

Atmega16单片机介绍

Atmega16单片机介绍

Atmega16单片机介绍Atmega16单片机介绍ATmega16是基于增强的AVR RISC结构的低功耗8 位CMOS微控制器。

由于其先进的指令集以及单时钟周期指令执行时间,ATmega16 的数据吞吐率高达1 MIPS/MHz,从而可以缓减系统在功耗和处理速度之间的矛盾。

ATmega16 AVR 内核具有丰富的指令集和32 个通用工作寄存器。

所有的寄存器都直接与算逻单元(ALU) 相连接,使得一条指令可以在一个时钟周期内同时访问两个独立的寄存器。

这种结构大大提高了代码效率,并且具有比普通的CISC 微控制器最高至10 倍的数据吞吐率。

ATmega16 有如下特点:16K字节的系统内可编程Flash(具有同时读写的能力,即RW W),512 字节EEPROM,1K 字节SRAM,32 个通用I/O 口线,32 个通用工作寄存器,用于边界扫描的JTAG 接口,支持片内调试与编程,三个具有比较模式的灵活的定时器/ 计数器(T/C),片内/外中断,可编程串行USART,有起始条件检测器的通用串行接口,8路10位具有可选差分输入级可编程增益(TQFP 封装) 的ADC ,具有片内振荡器的可编程看门狗定时器,一个SPI 串行端口,以及六个可以通过软件进行选择的省电模式。

工作于空闲模式时CPU 停止工作,而USART、两线接口、A/D 转换器、SRAM、T/C、SPI 端口以及中断系统继续工作;掉电模式时晶体振荡器停止振荡,所有功能除了中断和硬件复位之外都停止工作;在省电模式下,异步定时器继续运行,允许用户保持一个时间基准,而其余功能模块处于休眠状态;ADC 噪声抑制模式时终止CPU 和除了异步定时器与ADC 以外所有I/O 模块的工作,以降低ADC 转换时的开关噪声;Standby 模式下只有晶体或谐振振荡器运行,其余功能模块处于休眠状态,使得器件只消耗极少的电流,同时具有快速启动能力;扩展Standby 模式下则允许振荡器和异步定时器继续工作。

AVR ATmega16指令大全

AVR ATmega16指令大全

状态寄存器与标志位SREG:8 位状态寄存器,其中每一位的定义为:C:进位标志位Z:结果为零标志位N:结果为负数标志位V: 2 的补码溢出标志位S:N⊕V,用于符号测试的标志位H:操作中产生半进位的标志位T:用于和BLD、BST 指令进行位数据交换的位I:全局中断触发/禁止标志位算术和逻辑指令加法指令1.不带进位位加法ADD Rd,Rr 0≤d≤31,0≤r≤31说明:两个寄存器不带进位 C 标志相加,结果送目的寄存器Rd。

2.带进位位加法ADC Rd,Rr 0≤d≤31,0≤r≤31说明:两个寄存器和C标志的内容相加,结果送目的寄存器Rd。

3.字加立即数ADIW Rdl,K dl 为:24、26、28、30,0≤K≤63说明:寄存器对(一个字)同立即数(0~63)相加,结果放到寄存器对。

4.增1 指令INC Rd 0≤d≤31说明:寄存器Rd 的内容加1,结果送目的寄存器Rd 中。

减法指令1.不带进位位减法SUB Rd,Rr 0≤d≤31,0≤r≤31说明:两个寄存器相减结果送目的寄存器Rd 中。

2.减立即数(字节)SUBI Rd,K 16≤d≤31,0≤K≤255说明:一个寄存器和常数相减,结果送目的寄存器Rd。

3.带进位位减法SBC Rd,Rr 0≤d≤31,0≤r≤31说明:两个寄存器带着C 标志相减,结果放到目的寄存器Rd 中。

4.带进位位减立即数(字节)SBCI Rd,K 16≤d≤31,0≤K≤255说明:寄存器和立即数带着 C 标志相减,结果放到目的寄存器Rd 中。

5.减立即数(字)SBIW Rdl,K dl为24、26、28、30,0≤K≤63说明:寄存器对(字)与立即数0~63 相减,结果放入寄存器对。

6.减1 指令DEC Rd 0≤d≤31说明:寄存器Rd 的内容减1,结果送目的寄存器Rd 中。

取反码指令COM Rd 0≤d≤31说明:该指令完成对寄存器Rd 的二进制反码操作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

AVR 进行多通道AD转换的设计例子模型
AD中断采集完成后切换通道,这样AD触发用定时器触发或者连续采集模式都可以使用。

采样结果用一个数组存起来。

CODE:
//注意,得到的AD值并非实际的电压,而是0~1024(10位)或0~255(8位)。

#pragma interrupt_handler adc_isr:iv_ADC
void adc_isr(void)
{
//conversion complete, read value (int) using...
#if AD_JINGDU ==10
advalue=ADCL; //Read 8 low bits first (important)
advalue|=(int)ADCH << 8; //read 2 high bits and shift into top byte
#endif
#if AD_JINGDU ==8
advalue = ADCH;
#endif
if(SET_ADC==3) SET_ADC=0; //这是多路采集的一个思路
SET_ADC++;
AD_done=1; //转换完成标识位
}
[Copy to clipboard]
CODE:
//ICC-AVR application builder : 2007-7-25 10:40:22
// Target : M16
// Crystal: 7.3728Mhz
// 作者:古欣AVR与虚拟仪器[url][/url]
// AD转换测试程序
#include "config.h"
volatile uint8 ADC_Value[]={0x00,0x00,0x00};
void main(void)
{
adc_init(SET_ADC); //启动AD,ADC0(PA0)输入
DDRB = 0xff;
while(1)
{
if(AD_done==1) //AD转换完成标志位
{
AD_done=0;
advalue=(advalue*5000)/1024;//AVCC的实际测得电压乘以1000代替5000,结果转化成了mv,后面的1024取决于#define AD_JINGDU 10,如果使用8位精度,则是256
ADC_Value[SET_ADC]=advalue; //SET_ADC从0到2变化,采集三路电压值,存到
ADC_Value[0],ADC_Value[1],ADC_Value[2],具体的存放,你自己完成吧
//PORTB = advalue; //AD采样结果将在中断中存入advalue
//show(ADget_vol();) //显示浮点的实际电压值
}
}
}
[Copy to clipboard]
压缩包中附一个AD转换测试程序,在硬件上测试通过。

CODE:
//ICC-AVR application builder : 2007-7-25 10:40:22
// Target : M16
// Crystal: 7.3728Mhz
#include <iom16v.h>
#include <macros.h>
#define AD_JINGDU 10
volatile unsigned int value=0;
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0xFF;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
}
//ADC initialize
// Conversion time: 112uS
void adc_init(void)
{
ADCSR = 0x00; //disable adc
ADMUX = 0x00; //select adc input 0
ACSR = 0x80;
ADCSR = 0xCE;
}
void adc_single_init(unsigned char adc_input)
{
ADCSR = 0x00; //disable adc
#if AD_JINGDU ==10
ADMUX=0xC0|(1<<ADLAR)|adc_input; //2.56V 的片内基准电压源,AREF 引脚外加滤波电容,左对齐,8位精度,AD输入端ADC0
#endif
#if AD_JINGDU == 8
ADMUX=0xC0|adc_input;
#endif
//ADMUX=0x40|adc_input; //AVCC,AREF 引脚外加滤波电容
//ADMUX=adc_input; //AREF,内部Vref 关闭,AREF 引脚外加滤波电容ACSR |= 0x80; //禁用模拟比较器
ADCSR = (1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|0x06; //允许AD,启动转换,自动触发使能,中断使能,64分频
SFIOR &=~ 0xe0;//自动中断源选择,连续转换模式
}
#pragma interrupt_handler adc_isr:iv_ADC
void adc_isr(void)
{
//conversion complete, read value (int) using...
#if AD_JINGDU ==10
value=ADCL; //Read 8 low bits first (important)
value|=(int)ADCH << 8; //read 2 high bits and shift into top byte #endif
#if AD_JINGDU ==8
value = ADCH;
#endif
}
//call this routine to initialize all peripherals void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
adc_single_init(0);
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void main(void)
{
init_devices();
while(1)
{
PORTB = value;
}
}。

相关文档
最新文档