本文仅提供 MCP3202 芯片的STM32 代码运用部分,可结合芯片手册进行学习
MCP3202芯片手册介绍
#ifndef _MCP3202_H
#define _MCP3202_H
#include "sys.h"
#include "main.h"
#define mcp3202_cs_1 HAL_GPIO_WritePin(MCP3202_CS_GPIO_Port,MCP3202_CS_Pin,GPIO_PIN_SET)
#define mcp3202_cs_0 HAL_GPIO_WritePin(MCP3202_CS_GPIO_Port,MCP3202_CS_Pin,GPIO_PIN_RESET)
#define mcp3202_clk_1 HAL_GPIO_WritePin(MCP3202_CLK_GPIO_Port,MCP3202_CLK_Pin,GPIO_PIN_SET)
#define mcp3202_clk_0 HAL_GPIO_WritePin(MCP3202_CLK_GPIO_Port,MCP3202_CLK_Pin,GPIO_PIN_RESET)
#define mcp3202_din_1 HAL_GPIO_WritePin(MCP3202_DIN_GPIO_Port,MCP3202_DIN_Pin,GPIO_PIN_SET)
#define mcp3202_din_0 HAL_GPIO_WritePin(MCP3202_DIN_GPIO_Port,MCP3202_DIN_Pin,GPIO_PIN_RESET)
#define mcp3202_dout_read HAL_GPIO_ReadPin (MCP3202_DOUT_GPIO_Port,MCP3202_DOUT_Pin)
#define Bit_SET 1
#define Bit_RESET 0
#define BASE_VOLTAGE (3.3/4095)
#define AVERAGE_SIZE 1//取平均值个数
float get_mcp3202(u8 ch);
#endif
#include "mcp3202.h"
static void mcp3202_delay(u16 D) //延时
{
u16 E;
for(;D>0;D--)
{
for(E=10;E>0;E--) {;}
}
}
//-----------------------------------------------
u16 mcp3202(u8 ch)
{
u16 dat=0;
u8 i=0;
mcp3202_clk_0;
mcp3202_cs_1;
mcp3202_delay(5);
mcp3202_cs_0; //通信
mcp3202_din_1; //启动
mcp3202_clk_1;
mcp3202_delay(1);
mcp3202_clk_0;
mcp3202_din_1; //模式设置 0:伪差分模式 1:单端模式
mcp3202_clk_1;
mcp3202_delay(1);
mcp3202_clk_0;
if(ch) mcp3202_din_1; //单端模式下通道选择 0:通道0 1:通道1
else mcp3202_din_0; //伪差分模式下通道正负切换 0:通道0+ 通道1- 1:通道0- 通道1+
mcp3202_clk_1;
mcp3202_delay(1);
mcp3202_clk_0;
mcp3202_din_1; //输入控制字
mcp3202_clk_1;
mcp3202_delay(1);
mcp3202_clk_0;
mcp3202_delay(1);
for(i=0;i<13;i++) //接收数据12位 第13位无关
{
mcp3202_clk_1;
dat=dat<<1;
if(mcp3202_dout_read) dat=dat|0x01; //取第十二位
mcp3202_delay(1);
mcp3202_clk_0;
mcp3202_delay(1);
}
mcp3202_cs_1; //结束
mcp3202_delay(2);
dat=dat&0x0FFF; //取12位
return dat; //返回AD值
}
float get_mcp3202(u8 ch) //读取多个求平均
{
float average=0 , temp=0;
u16 i=0;
for( i=0; i<AVERAGE_SIZE; i++ )
{
mcp3202_delay(5);
temp+=(float)mcp3202(ch);
}
average=(temp/AVERAGE_SIZE)*BASE_VOLTAGE;
return average;
}