芯片简介
MCP3208/MCP3204是一种片外12位精度的AD采集芯片,前者是8通道,后者是4通道,其他的都一样。找不到该芯片的中文手册的点这里。
引脚定义
时序
结合手册5.0章节的说明看时序图。
电平状态稳定时间
可以看到,最短稳定时间的最长的为500ns(0.5us),均小于1us,只要在程序中保证引脚的电平稳定时间至少超过1us即可。
控制位
第一个CS拉低且Din拉高的信号为起始位。紧跟着其实位的是Single/Diff位、以及D0 D1 D2位。
起始位后的第四个时钟周期的上升沿开始采样,在第五个时钟周期的下降沿采样结束。
如果设备上电的时候CS引脚是低电平,需要拉高再拉低才能初始化设备。意思就是说上电的时候的低电平对通信是无效的。
数据位
采样结束后,下一个周期的下降沿会输出一个低电平的空位。
紧接着12个周期将转换结果以MSB方式输出,下降沿输出数据。
如果12位输出完了,还是低电平,就以LSB继续输出。LSB输出完了还是低电平的话就一直输出0。如上图
数据计算
因为是12位的AD数据,根据读取到的值除以2的12次方(4096),再乘以参考电压就是通道的模拟电压值。
代码
由于每次采样时的SPI控制字和SPI数据字不是整字节,而且数据量很小,对速度要求不是特别高。所以,使用软件模拟SPI是最稳定的方法。驱动代码见github
mcp.c
#include "mcp.h"
#include "delay.h"
void MCP_PORTInit()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PB端口时钟
GPIO_InitStructure.GPIO_Pin = MCP_CS|MCP_CLK|MCP_DIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化
GPIO_SetBits(MCP_PORT,MCP_CS|MCP_CLK|MCP_DIN); //output high
GPIO_InitStructure.GPIO_Pin = MCP_DOUT;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //float input
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(MCP_PORT, &GPIO_InitStructure); //根据设定参数初始化
}
float MCP3208_getAD(u8 channel)
{
u8 i=0;
u16 resualt=0;
CS_Low;//CS=0
CLK_Low;//CLK=0
delay_us(3);
for(i=0;i<6;i++)
{
CLK_High;//CLK=1
delay_us(3);
CLK_Low;//CLK=0
if(channel&0x80)
DIN_High;
else
DIN_Low;
delay_us(3);
channel<<=1;
}
CLK_High;//CLK=1
delay_us(3);
CLK_Low;//CLK=0
delay_us(3);
CLK_High;//CLK=1
delay_us(3);
CLK_Low;//CLK=0
delay_us(3);
for(i=0;i<12;i++)
{
resualt<<=1;
CLK_High;//CLK=1
if(Read_DOUT)
resualt|=0x0001;
delay_us(3);
CLK_Low;//CLK=0
delay_us(3);
}
CS_High;//CS=1
return (resualt/4096.0)*Vref;
}
mcp.h
#ifndef _MCP_H_
#define _MCP_H_
#include "sys.h"
#define MCP_PORT GPIOA
#define MCP_CS GPIO_Pin_4
#define MCP_CLK GPIO_Pin_5
#define MCP_DIN GPIO_Pin_7
#define MCP_DOUT GPIO_Pin_6
#define CLK_High GPIO_SetBits(MCP_PORT,MCP_CLK)
#define CLK_Low GPIO_ResetBits(MCP_PORT,MCP_CLK)
#define CS_High GPIO_SetBits(MCP_PORT,MCP_CS)
#define CS_Low GPIO_ResetBits(MCP_PORT,MCP_CS)
#define DIN_High GPIO_SetBits(MCP_PORT,MCP_DIN)
#define DIN_Low GPIO_ResetBits(MCP_PORT,MCP_DIN)
#define Read_DOUT GPIO_ReadInputDataBit(MCP_PORT,MCP_DOUT)
#define MCP3208_CHO 0xC0
#define MCP3208_CH1 0xC8
#define MCP3208_CH2 0xD0
#define MCP3208_CH3 0xD8
#define MCP3208_CH4 0xE0
#define MCP3208_CH5 0xE8
#define MCP3208_CH6 0xF0
#define MCP3208_CH7 0xF8
#define Vref 3.22
float MCP3208_getAD(u8 channel);
void MCP_PORTInit(void);
#endif
用改代码读取了5个通道的数据,很稳定
上一篇:【STM32】条件编译不起作用是什么原因
下一篇:STM32-快速上手SPI
推荐阅读最新更新时间:2024-11-09 20:54
推荐帖子
- 基于FPGA的图像处理
- 基于FPGA的图像处理
- 至芯科技FPGA大牛 FPGA/CPLD
- 初学WDM搞了最简单的程序总是编译错误,请前辈指教
- 我用VC++6和DDK(xp)编译hellowdm文件,总出错。VC6安装在D:\\programfiles\\vc6,DDK安装在D:\\programfiles\\DDK0,在ddk0\\wdmex3目录建立4个文件:hellowdm.h,hellowdm.cpp,makefile,sources。代码都从网上copy。后启动ddk的build,再进入ddk0\\wdmex3,输入build。老是出现errorlnk1181:cannotopeninputfile\'obj
- w19864h 嵌入式系统
- 最后一天!有奖直播:ST新一代低功耗蓝牙协议栈:高度灵活、易用、可定制!
- 直播主题:高度灵活的、易用的、可定制化的协议栈--BlueNRG-LP协议栈介绍直播时间:2022年2月24日(周四)上午10:00-11:30内容简介:本次讲座主要介绍意法半导体为其新一代低功耗蓝牙SoC芯片-BlueNRG-LP所属的解决方案中,所提供的新一代低功耗蓝牙协议栈(V3.x),所具备的高度的灵活性、易用性和可定制化的特点。首先,我们将从介绍芯片的功能等技术背景开始,简单介绍下其软件架构以及协议栈的工作原理,进一步详细介绍协议栈的配置方式,静
- EEWORLD社区 RF/无线
- opt3001光线传感器问题求助
- 用51单片机模拟I2C时序控制opt3001光线传感器,用逻辑分析仪抓出来的数据显示,opt3001没有反馈ACK给MCU,请问这种情况下最有可能是哪点出问题了呢?下图是逻辑分析仪抓出来的时序图opt3001光线传感器问题求助程序的流程如下,先读ManufacturerID和DeviceID,然后配置Configuration为0xCC10,等待800ms转换时间,判断CRF位是否为1(转换完成),进行Result值的读取,代码如下opt3001Manufacturer
- Kileo 51单片机
- C2000字节的处理
- 有时候我们要按字节来处理数据,由其是在做8位的数据通讯时。大部分的MCU是支持字节地址的,也就是说一个地址加1,数据是移动一个字节。然而对于C2000来说,它是按16位对齐,也就是说地址加1,数据是移动一个16位,也就是两个字节。这使得我们在处理8位数据的时候非常不方便,尤其是32位或浮点类型的数据,不但要分成四个字节,而且如果这个32位数据是奇地址时,还要面临数据传输时的错位现象。下面给大家介绍几种C2000字节处理的方法。1。内含位结构体的共同体这个方法可以对赋值
- Jacktang 微控制器 MCU
- 【2024 DigiKey 创意大赛】二月柳絮大作战项目-04驱动ESP32-S3-LCD-Ev-Board液晶屏
- 需要安装lvgl、ESP32_Display_Panel,具体可参考:【2024DigiKey创意大赛】二月柳絮大作战项目-02获取ESP32-S3-LCD-Ev-Board触摸参数-DigiKey得捷技术专区-电子工程世界-论坛(eeworld.com.cn)打开案例库出现错误:根据提示需要打开官方教程:打开官方案例库可以发现相应指导说明:如何使用:选择配置开发板:根据开发板类型选择和驱动参数:提示需要安装
- Maker_kun DigiKey得捷技术专区