ADC芯片MCP3202 驱动代码

本文详细介绍了如何在STM32平台上使用MCP3202芯片进行ADC读取,包括GPIO配置、数据传输过程以及多值求平均的函数实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文仅提供 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;         
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值