ADC
使得调节开发板上的电位器时,数码管上能够显示 AD 模块 采集电位器的电压值且随之变化。
开发板上有三个应用:光敏电阻,热敏电阻,电位器。
一般 AD 转换有多个输入,提高使用效率。
ADC 通过地址锁存与译码判断采用哪个输入。
运算放大器,可以作为电压比较器、同相反相放大器、电压跟随器
T 型电阻网络 DA 转换器:
低通滤波器:输入是有直交流两个分量的,可以通过低通滤波器提取出直流。电压跟随器让驱动能力增加。
da 简单些,因为d值是固定的,根据d调整a即可。
ad 怎么判断电压大小?我们用一个电压值和给定电压作比较,看大于还是小于,逐渐逼近来找近似值。
分辨率:精细程度。比如8位的 ad 可以把 5v 转换到 0~255 范围。
转换速度:最大采样/建立频率。
XPT2046 采用 SPI,的时序在上升沿输入,下降沿输出,可实现输入再输出。
采用单端模式(触摸屏查分会更好一些)。
PD1=1 采用内部参考电压,内部电压为 2.5v,我们知道adc 映射范围是 0~5v,所以1采用内部电压不如0采用5v的外部电压。
A 地址配置:
VBAT:电池电压。
AUX:辅助电压。
XP YP:XY 正极。
读取指令并 ad 转化:
#define XPT2046_XP_8 0x9C // 1001 1100
#define XPT2046_YP_8 0xDC // 1101 1100
#define XPT2046_VBAT_8 0xAC // 1010 1100
#define XPT2046_AUX_8 0xEC // 1110 1100
#define XPT2046_XP_12 0x94 // 1001 0100
#define XPT2046_YP_12 0xD4 // 1101 0100
#define XPT2046_VBAT_12 0xA4 // 1010 0100
#define XPT2046_AUX_12 0xE4 // 1110 0100
unsigned int XPT2046_ReadAD(unsigned char command)
{
unsigned char i;
unsigned char temp=command;
unsigned int ADValue = 0;
XPT2046_DCLK = 0;
XPT2046_CS = 0;
for (i = 0; i < 8; i++)
{
XPT2046_DIN = temp >> 7;
temp <<= 1;
XPT2046_DCLK = 1;
XPT2046_DCLK = 0;
}
for (i = 0; i < 12; i++)
{
XPT2046_DCLK = 1;
XPT2046_DCLK = 0;
if (XPT2046_DOUT)
ADValue |= (0x0800 >> i);
}
XPT2046_CS = 1;
//for 12 bit:
if(command&0x08)return ADValue>>4;
else return ADValue;
}
void main()
{
unsigned int ADValue = 0;
LCD_Init();
LCD_ShowString(1, 1, "ADC NTC RG");
while (1)
{
ADValue = XPT2046_ReadAD(XPT2046_XP_8);//电位器
LCD_ShowNum(2, 1, ADValue, 3);
ADValue = XPT2046_ReadAD(XPT2046_YP_8);//热敏电阻
LCD_ShowNum(2, 5, ADValue, 3);
ADValue = XPT2046_ReadAD(XPT2046_VBAT_8);//光敏电阻
LCD_ShowNum(2, 9, ADValue, 3);
delayMs(10);
}
}
dac 也是采用 pwm 的原理,改变01 叫错频率来模拟灯的亮度(输出口:P2^1)。所以 dac 用处不广泛,因为可以被代替。