【第十四届蓝桥杯单片机组】学习笔记(5):PCF8591( AD/DA芯片)

目录

  • 概述
  • 功能字
    • 芯片寻址
    • 控制字
    • A/D转换
      • 单通道读取
      • 多通道读取

概述

【第十四届蓝桥杯单片机组】学习笔记(5):PCF8591( AD/DA芯片)_第1张图片

  • 芯片通信方式:IIC
  • AIN0,AIN1,AIN2,AIN3:(Analog signal In) 模拟信号输入
  • AOUT:模拟信号输出

功能字

芯片寻址

这是在比赛提供的PCF8591芯片手册里的,描述了这个芯片的IIC地址

【第十四届蓝桥杯单片机组】学习笔记(5):PCF8591( AD/DA芯片)_第2张图片

  • 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.

【第十四届蓝桥杯单片机组】学习笔记(5):PCF8591( AD/DA芯片)_第3张图片
就是说,这个控制字是要写在芯片寄存器中的去设置芯片的功能;

  • 高四位:用于使能模拟输出,并将模拟输入编程为单端或差分输入。
  • 低四位:选择读取高四位所确定的通道,若将自动读取的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);
    }
}

【第十四届蓝桥杯单片机组】学习笔记(5):PCF8591( AD/DA芯片)_第4张图片

多通道读取

在读取模拟信号的时候,我们可以看到第一次读出来的数据是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();
    }
}

【第十四届蓝桥杯单片机组】学习笔记(5):PCF8591( AD/DA芯片)_第5张图片
PCF8591详解(蓝桥杯单片机模块(IIC总线))

你可能感兴趣的:(单片机,蓝桥杯,单片机,学习)