目录
- 概述
- 功能字
- 芯片寻址
- 控制字
- A/D转换
- 单通道读取
- 多通道读取
概述
- 芯片通信方式:IIC
- AIN0,AIN1,AIN2,AIN3:(Analog signal In) 模拟信号输入
- AOUT:模拟信号输出
功能字
芯片寻址
这是在比赛提供的PCF8591芯片手册里的,描述了这个芯片的IIC地址
- fixed part:固定的部分,即高四位是不变的,说明改芯片的地址是根据其他引脚去确认的
- programmable part:可编程的部分,可以从电路原理图里看到A0,A1,A2是可以接受外部信号的,所以这部分是根据我们电路连接来确定0/1的
- R/W:即为常规的IIC通讯的读写地址,读为1,写为0;三大通信协议(二):IIC通信协议
所以综上我们可以得到,蓝桥杯板子里芯片的地址是:(1001 000X);写地址:0x90;读地址:0x91
控制字
芯片手册上的介绍:
The second byte sent to a PCF8591 device will be stored
in its control register and is required to control the device
function.
就是说,这个控制字是要写在芯片寄存器中的去设置芯片的功能;
- 高四位:用于使能模拟输出,并将模拟输入编程为单端或差分输入。
- 低四位:选择读取高四位所确定的通道,若将自动读取的flag置1,则通道号会自动递增
A/D转换
单通道读取
uint8_t AdcRead()//读取一次ADC的数值
{
uint8_t _data;
_data = IIC_RecByte();//IIC读一个字节,官方驱动会给出
IIC_SendAck(0);//PCF8591读取一次就要给个回应,这样芯片才会采集下一个的值
return _data;
}
void main(void)
{
uint8_t adc=0;
UartInit();
if(Pcf8591_Adc_Init(0x03)==1)
{
printf("adc init success\r\n");
}
while (1)
{
adc=AdcRead();
printf("%bu\r\n",adc);
}
}
多通道读取
在读取模拟信号的时候,我们可以看到第一次读出来的数据是128,那么我们就可以用这个标志去区分自动读取多通道时切换不同通道。
- 初始化的控制字:0000 01xx,即0x04也可
void main(void)
{
uint8_t adc=0,channel=0;
UartInit();
while(Pcf8591_Adc_Init(0x04)!=1)
{
printf("adc init eeror\r\n");
Delay100ms();
}
while (1)
{
adc=AdcRead();
if(adc==128) channel=-1;
else channel=(channel+1)%4;
printf("channel is %bu,data is %bu\r\n",channel,adc);
Delay500ms();
}
}
PCF8591详解(蓝桥杯单片机模块(IIC总线))