MCP3008芯片介绍
-
datasheet的链接如下(只有英文版):MCP3008
-
主要特性:8通道模拟输入,SPI通讯协议,输出电压数据格式为10bit。
-
引脚封装
-
引脚功能
引脚 | 功能 |
---|---|
CH0~CH7 | 模拟信号输入通道 |
NC | 空引脚 |
VDD | 电源(接5v即可) |
VREF | 参考电压(重点讲解) |
AGND | 模拟信号地 |
DGND | 数字信号地 |
CLK | 时钟信号 |
DOUT | 信号输出(MISO) |
DIN | 信号输入(MOSI) |
CS | 片选信号(低电平有效)即低电平芯片工作 |
- 使用方法(重点!!)
- 单通道工作方式(通过SPI协议设置)
MCP3008芯片会将VREF引脚的输入电压分成1024(2的10次方等于1024)份,每一份代表一个电压分辨率,则芯片输出的数值与分辨率相乘即为所测电压。本例这个我将VREF接4.096v上,则每一份的电压值为4.096/1024 = 0.0040039,取小数点后三位则为 0.004,则实际测得电压值为通过SPI协议读取得数据与这个分辨率相乘。(注:取4.096电压值主要是使得分辨率数值简单为0.004,其他电压自行计算)。
- 双通道模式(通过SPI协议设置)
双通道模式也叫差分输入,输入电压取两个引脚的电压差,分辨率同理都是在芯片内部完成转换的。
- 电路接线图
AT89C51单片机通讯 部分源码如下(温度数据存在数组data_temp中):
#include <reg51.h> //包含单片机寄存器的头文件
#include <intrins.h> //包含_nop_()函数定义的头文件
#include <stdio.h>
#define uint8_t unsigned char
#define uint16_t unsigned short int
sbit SCK=P2^3; //SCK位
sbit SI=P2^1; //SI位
sbit SO=P2^2; //SO位
sbit CS=P2^0; //CS
/****************MCP3008**************************/
unsigned char SPI_WriteReadByte(unsigned char dat)
{
unsigned char i = 0;
unsigned char temp = 0;
unsigned char read_data = 0x00;
// SCK=0;
for(i=0;i<8;i++)
{
SCK=0;
temp=((dat&0x80)==0x80)?1:0;
dat= dat<<1;
SI=temp;
SCK=1;
_nop_();
_nop_();
read_data <<=1;
read_data|=(unsigned char)SO;
}
// SCK=1;
return read_data;
}
uint16_t read_temp() //读取ad转换值
{
uint16_t temperature = 0 ;
SCK=0; //将SCK置于已知状态
CS=0; //拉低CS,选中X5045
data_temp[0] =SPI_WriteReadByte(0x01); //读出数据
data_temp[1] =SPI_WriteReadByte(0x80); //读出数据
data_temp[2] =SPI_WriteReadByte(0); //读出数据
CS=1; //拉高CS
SCK=0; //将SCK置于已知状态
data_temp[1] &= 0x03;
temperature |= data_temp[1];
temperature = (temperature<<8)| data_temp[2];
return temperature; //返回读出的数据
}
Proteus演示效果
Matlab演示效果
matlab演示效果
总结
LM335(关于LM335可以看我另一篇文章LM335)采集温度并改变输入电压,MCP3008模数转换器将电压转换成10bit数据,并通过SPI通讯协议发送至单片机,单片机通过串口输出温度值。
以上就是我个人的实战经验,如有不对请多多指教,感谢!