AD转换实验

 

相信大家都知道单片机输出得是数字信号0或者1,那么想要测量模拟信号得大小该怎么测量呢?

各种模拟量都可以通过变送器或传感器变换成相应得数字量送给单片机。

C8051F020在片内继承了AD/DA转换电路

 

AMX0CF控制单端输入或双端输入

 

AMX0SL控制某一时刻外部模拟量和一个内部温度传感器那个通过多路选择器

ADC0CF来设置多路选择器出来得模拟量得转换速度和对模拟量得放大倍数

ADC0CN(把模拟量转换成数字量)对ADC进行模拟转换得启动,启动方式采样保持,转换结束,数字量格式进行设定

12位转换好得数字量存放在数据寄存器ADC0H,ADC0L

设定好以上以后cpu就按照设定好得模式在模拟量转换好时用指令读出数据寄存器中得数字量或在中断服务中读取数字量

3797487364ed440da24b45e68835dac2.png

 下面我们来仔细看一下各个寄存器

 1.选择差分输入  AMX0CF=0x01;

057a4762c62941c39c1ce9de789c9acf.png

 2.这里是用来选择是温度传感器使能还是,差分输入的,这里我们选择AMUX0SL=0x0f;

a70f24fae7594437af0fdfd71aea98be.png

3.这里选择SAR的时钟ADC0=(240/25)<<3;ADC0|=0x01;

注意下方的位0-2为可编程增益放大器PGA,也就是放大倍数 

77b3152f4cf44e3f909ac94212d70d2e.png

 4.ADC0CN=0x81;

 b9c6956554f44f9d9aba646295fb5aed.png

 

5. 允许温 度传感器,ADC0 电压基准取自 VREF0 引脚。REF0CN=0x07;33ed1b6080b44c0fb8c722090ec05a17.png

 这里我们都设置好了以后就完成基本的初始化,我们要实现按0为温度传感器的值,和按1为电压值(电压值是那个电压值)可以改变其中的AMX0SL来选择用不用温度传感器,和ADC0CF来配置放大增益,具体如下

4a658363078f4a4c84321cef33666592.png

 下面我们就可以启动转换,和等待转换完成,完成以后的结果就存在ADC0H和ADC0L中然后按照相对应的公式转换一下就可以啦

5e10b9265757478d8818c4559cb38f0d.png

 

 

 

 

 

### PCF8591 AD转换实验原理及应用 #### 1. PCF8591简介 PCF8591是一种带有I²C接口的8位模数/数模转换器,广泛应用于嵌入式系统的模拟信号采集场景。它支持四路模拟输入通道以及一路模拟输出功能,适用于简单的数据采集任务。 #### 2. AD转换基本流程 AD转换的过程可以概括为以下几个阶段: - **初始化设备**:在使用前需将PCF8591配置为所需的模式,例如选择输入通道并启用自动增量模式[^1]。 - **启动转换**:通过向控制寄存器写入特定命令字来触发一次新的AD转换操作。 - **读取结果**:当转换完成之后,可以通过I²C协议从相应的寄存器地址中提取数字化后的数值。 #### 3. 控制参数设定 为了满足不同应用场景的需求,在实际开发过程中还需要考虑如下几个方面: - **采样频率调整**:依据具体项目的实时性需求合理规划每次查询之间的时间间隔,从而间接影响整体的有效采样速率。 - **精度优化**:尽管PCF8591本身提供的是8比特分辨率,但是通过对多次测量求平均等方式也可以有效提升最终结果的一致性和准确性[^2]。 #### 4. 应用实例分析 以基于ATmega系列MCU构建的一个简单示例说明如何利用该器件完成整个闭环控制系统的设计思路: - 使用电位计作为外部变量源接入任意一个可用端口; - 编程定义好周期性的事件处理函数用于定期发起新一轮的数据收集动作,并把得到的新鲜样本传递给后续逻辑单元进一步加工展示出来,比如驱动七段LED显示器呈现当前检测值的变化趋势图等等。 ```c #include <avr/io.h> #include <util/delay.h> void init_adc(void){ ADCSRA |= (1<<ADEN)|(7<<ADPS0); // Enable ADC and set prescaler to 128 } uint16_t read_adc(uint8_t channel){ ADMUX = (ADMUX & 0xF0)|channel; ADCSRA |= (1<<ADSC); while(ADCSRA&(1<<ADSC)); return ADC; } int main(){ uint16_t value; DDRB=0xFF; init_adc(); while(1){ value=read_adc(0)*5/1024; PORTB=value>>3; _delay_ms(100); } } ``` 上述代码片段展示了在一个典型的AVR微控制器平台上执行连续监测任务的具体方法论框架结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值