赞
踩
引脚 | 功能 |
---|---|
CH0~CH7 | 模拟信号输入通道 |
NC | 空引脚 |
VDD | 电源(接5v即可) |
VREF | 参考电压(重点讲解) |
AGND | 模拟信号地 |
DGND | 数字信号地 |
CLK | 时钟信号 |
DOUT | 信号输出(MISO) |
DIN | 信号输入(MOSI) |
CS | 片选信号(低电平有效)即低电平芯片工作 |
MCP3008芯片会将VREF引脚的输入电压分成1024(2的10次方等于1024)份,每一份代表一个电压分辨率,则芯片输出的数值与分辨率相乘即为所测电压。本例这个我将VREF接4.096v上,则每一份的电压值为4.096/1024 = 0.0040039,取小数点后三位则为 0.004,则实际测得电压值为通过SPI协议读取得数据与这个分辨率相乘。(注:取4.096电压值主要是使得分辨率数值简单为0.004,其他电压自行计算)。
双通道模式也叫差分输入,输入电压取两个引脚的电压差,分辨率同理都是在芯片内部完成转换的。
#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; //返回读出的数据 }
matlab演示效果
LM335(关于LM335可以看我另一篇文章LM335)采集温度并改变输入电压,MCP3008模数转换器将电压转换成10bit数据,并通过SPI通讯协议发送至单片机,单片机通过串口输出温度值。
以上就是我个人的实战经验,如有不对请多多指教,感谢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。