嵌入式人工智能(12-基于树莓派4B的AD/DA转换-PCF8591)

1、AD/DA

AD转换(模数转换)是将模拟信号转换为数字信号的过程。在AD转换中,模拟信号通过采样和量化的方式转换为数字形式的离散样本。这个过程涉及到三个基本步骤:采样、量化和编码。

1. 采样:采样是指在一定时间间隔内获取模拟信号的离散样本。采样频率决定了每秒采样的样本数,通常以赫兹(Hz)为单位。2. 量化:量化是将连续的模拟信号幅度值转换为离散的数字值。通过将模拟信号幅度值映射到离散级别上,实现对模拟信号的离散表示。3. 编码:编码将量化后的样本值表示为二进制数据,以便将其存储或传输。常用的编码方法包括二进制编码和压缩编码。

DA转换(数模转换)是将数字信号转换为模拟信号的过程。在DA转换中,数字数据根据一定的规则转换为模拟信号。DA转换器的输入是一系列数字样本,输出为连续的模拟信号。

1. 数字数据:数字数据通常以二进制形式表示,并存储在计算机系统或其他数字设备中。2. 重构:DA转换器通过重构技术将数字数据转换为连续的模拟信号。重构过程中,数字样本被插值和滤波,使其变得连续且光滑。3. 输出模拟信号:DA转换器的输出是通过模拟电路和滤波器处理后的连续模拟信号。输出信号的连续性和精确性取决于DA转换器的性能。

2、PCF8591

PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I²C总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。

PCF8591的功能包括多路模拟输入、内置跟踪保持、8-bit模数转换和8-bit数模转换。PCF8591的最大转化速率由I2C总线的最大速率决定。

3、PCF8591与树莓派连接

该PCF8591模块集成了热敏电阻,光敏电阻、2个可调电位器的4路AD输入,通过跳线帽打开输入通道,一路DA通道,控制LED灯亮暗。接线VCC、GND无须多言,SDA、SCL接BOARD的第3和5脚,物理引脚,同OLED,这里把OLED线拔了。如果要使用多个IIC设备,可使用IIC扩展模块,PCF8574为一款通过I2C总线扩展IO的芯片,单个PCF8574可扩展8个IO,一个I2C总线最多可挂载8个PCF8574,所以树莓派最多可扩展64个IO。然而,实际设计中由于总线电容的限制,通常不建议在I2C总线上连接超过8个设备。这是因为I2C使用的GPIO为开漏结构,要求外部有电阻上拉,电阻和总线电容产生了一个RC滤波效应,过多的设备会增加总线的不稳定性。

树莓派通过其I2C引脚(通常是3和5号引脚)与外部I2C设备进行通信,这些引脚遵守‌SMBus(系统管理总线)协议,这是一种特殊的I2C协议。树莓派支持使用Python的SMBUS库来访问和控制I2C设备。‌

4、代码

读取AIN0-AIN3通道的值,并且用光敏电阻的值来控制AOUT,光线越暗,LED灯越亮。用手遮挡光敏电阻,其AD值会变大;DA转换写入的数字越大,LED越暗,因此读取到的光敏电阻的数字量需要用255-其AD值,写入AOUT,这样LED越亮。

# ADC.Setup(Address)  # 通过 sudo i2cdetect -y -1 可以获取到IIC的地址
# ADC.read(channal)	# 通道选择范围为0-3
# ADC.write(Value)	# 值的范围为:0-255

import smbus
import time

bus = smbus.SMBus(1)

#通过 sudo i2cdetect -y -1 可以获取到IIC的地址
def setup(Addr):
	global address
	address = Addr

# 读取模拟量信息
def read(chn): #通道选择,范围是0-3之间
	try:
		if chn == 0:
			bus.write_byte(address,0x40)
		if chn == 1:
			bus.write_byte(address,0x41)
		if chn == 2:
			bus.write_byte(address,0x42)
		if chn == 3:
			bus.write_byte(address,0x43)
		bus.read_byte(address) # 开始进行读取转换
	except Exception as e:
		print ("Address: %s" % address)
		print (e)
	return bus.read_byte(address)

# 模块输出模拟量控制,范围为0-255
def write(val):
	try:
		temp = val # 将数值赋给temmp 变量
		temp = int(temp) # 将字符串转换为整型
		# 在终端上打印temp以查看,否则将注释掉
		bus.write_byte_data(address, 0x40, temp)
	except Exception as e:
		print ("Error: Device address: 0x%2X" % address)
		print (e)

if __name__ == "__main__":
	setup(0x48)
	while True:
		print ('AIN0 = ', read(0))
		print ('AIN1 = ', read(1))
		print ('AIN2 = ', read(2))
		time.sleep(1)
		tmp = read(1)
		write(255-tmp)
		print(tmp)

5、现象

PCF8591

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值