【MCP3208/MCP3204】STM32多通道AD采集

发布者:zuiquan最新更新时间:2022-04-20 来源: eefocus关键字:MCP3204  STM32  AD采集 手机看文章 扫描二维码
随时随地手机看文章

芯片简介

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个通道的数据,很稳定

关键字:MCP3204  STM32  AD采集 引用地址:【MCP3208/MCP3204】STM32多通道AD采集

上一篇:【STM32】条件编译不起作用是什么原因
下一篇:STM32-快速上手SPI

推荐阅读最新更新时间:2024-11-09 20:54

初探STM32 SPI2中断接受多组数据的处理方式
一、描述 两块STM32板子之间进行SPI通讯,都使用的是SPI2。主机连续发送多组数据(数据的格式为半字,即16位),从机采用SPI2中断方式接受主机发过来的多组数据。 针对从机中断接受方法我尝试了两种方案: 方案一:从机每接收主机发来的一组数据就进入中断一次,即主机发来几组数据从机就进入几次中断。 方案二:仅当主机发来第一组数据时,从机才触发一次中断,然后关闭中断,以循环接受的方式接受主机发过来的剩下几组数据,当所有数据接受完后,再打开从机的接受中断。 二、程序 因为两种方案的主机程序是一样的,如下: uint16_t ADC_ConvertedValueLocal ; uint8_
[单片机]
STM32启动文件简单分析
STM32启动文件简单分析(STM32F10x.s适用范围)定时器, 型号, 名字在 STM32不完全手册里面 ,我们所有的例程都采用了一个叫STM32F10x.s的启动文件,里面定义了STM32的堆栈大小以及各种中断的名字及入口函数名称,还有启动相关的汇编代码。STM32F10x.s是MDK提供的启动代码,从其里面的内容看来,它只定义了3个串口,4个定时器。实际上STM32的系列产品有5个串口的型号,也只有有2个串口的型号,定时器也是,做多的有8个定时器。比如,如果你用的STM32F103ZET6,而启动文件用的是STM32F10x.s的话,你可以正常使用串口1~3的中断,而串口4和5的中断,则无**常使用。又比如,你TIM1~
[单片机]
stm32CAN通信代码
最近做项目需要用到can通信,这里分享一下自己的can通信学习代码,我使用的是正点原子的精英开发板,参考的资料也是正点原子的库函数指南,此外我也看完了can入门手册(21ic电子网可以下载到),对can通信原理了解了不少,can的内容还是很多的,这里我也不说原理,毕竟内容太多,只分享一下自己的代码,本来是跟着正点原子的例程走的,结果我的tft屏幕坏了(特容易坏),而且自己也只有一块开发板,没有办法,就仿真吧,(插一条:仿真来找小虫子简直不要太爽,我后面分享一下自己用仿真的一些小经验吧),学习32后面基本上要用到按键和LED,建议大家只看原理图自己写一遍,有自己的代码,方便以后调用,显示屏也是OLED和TFT两个在后面的代码调试中结
[单片机]
STM32学习之 assert_failed
/******************************************************************************* 固件函数库通过检查库函书的输入来实现运行时间错误侦测。 通过使用宏assert_param来实现运行时间检测。 所有要求输入参数的函数都使用这个宏。它可以检查输入 参数是否在允许的范围之内。 注: 运行时间检查,即宏assert_param应当只在库在Debug模式下 编译时使用。建议在用户应用代码的开发和调试阶段使用 运行时间检查,在最终的代码中去掉它们以改进代码尺寸 和速度。 如果用户仍然希望在最终的代码中保留这项功能, 可以在调用库函数前,重新使用宏assert_p
[单片机]
在Keil4中建立基于V3.4.0固件库的STM32工程
几个月前刚接触STM32时,第一感觉就是固件库里的文件又多又深,还好发现固件库里自带有范例文件,但是它们全都是针对特定的评估板的,手头只有一块STM MCU 3 in 1 MiniKit。虽说作些修改就可为我所用,可对于像我这样还没入门的菜鸟,知道要如何修改,并且编译通过,却是非常困难。 昨晚闲暇,在网上找了一些资料,自己也学着新建了一个工程。今天写下来,顺带温故一遍。 首先介绍一下操作环境: Keil版本: μVision 4.1.0 STM32固件库版本: V3.4.0 第一步,建立工程文件夹,在其子文件夹内拷贝并整理好相应的文件。 1.1、建立工程文件夹,将它命名为 Sys
[单片机]
经典_STM32_ADC多通道采样的例子
STM32 ADC多通道转换 描述:用ADC连续采集11路模拟信号,并由DMA传输到内存。ADC配置为扫描并且连续转换模式,ADC的时钟配置为12MHZ。在每次转换结束后,由DMA循环将转换的数据传输到内存中。ADC可以连续采集N次求平均值。最后通过串口传输出最后转换的结果。 程序如下: #i nclude stm32f10x.h //这个头文件包括STM32F10x所有外围寄存器、位、内存映射的定义 #i nclude eval.h //头文件(包括串口、按键、LED的函数声明) #i nclude SysTickDelay.h #i nclude UART_INTERFACE.h #i nclude stdio.h #def
[单片机]
STM32使用TCP透传方式与ONENET进行连接的简单教程
推荐使用本文之前有一定的嵌入式基础,请先确保了解以下名词(提前百度):cJSON,EDP,TCP透传 首先在ONENET平台上创建一个TCP透传的产品,这段在ONENET开发者中心上有很多教程,就不再赘述。 下载一个EdpProtoDebugger 先使用这个工具与ONENET建立连接,具体教程 可以看到,实际上建立与平台的连接就是通过一个简单的EDP数据包实现的,我们在嵌入式应用中,只需要先和ONENET的服务器连接,然后发送这一串设备认证的数据包,你的设备就上线了,之后就可以通过发送JSON格式的数据或者是发送分号间隔字符串的方式来进行数据传输 tip:本文只介绍以分号间隔字符串的方式发送数据,ONENET服务器下发的命令是J
[单片机]
STM32(Cortex-M3)中有两个优先级的概念
STM32(Cortex-M3)中有两个优先级的概念 抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断
[单片机]

推荐帖子

基于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得捷技术专区
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved