ADC(二)—MCP3202

xiaoxiao2021-02-28  39

1.器件介绍

mcp3202是Microchip(微芯科技)公司产的一款ADC芯片,成本低,使用方便。本文主要分析软件使用方面的特点及方法。

1.1器件特点

1)转换精度:12bit

2)转换速率:100ksps(最快)

3)伪差分输入

4)4线spi控制接口

5)使用简单,无须复杂的寄存器配置,直接通过spi获取转换数据

1.2应用范围

1)传感器

2)过程控制

3)数据采集

4)电池供电系统

1.3器件基础框图

2.器件使用(软件)

2.1时序图

驱动mcp3202,主要是实现一个spi总线,首先看改器件时序图,如下。

时序图分析:

1)片选线、时钟线与普通spi一致;

2)数据输入(SDI):第一位为启动位,固定为1,第2、3位为配置选择位,具体选择信息如下;第4位MSBF,设置数据格式,高位/低位在前,一般情况下我们都使用“高位在前”的模式;后面的数据则为无关位;

3)数据输出(SDO):从第6个时钟周期开始,返回的数据为有效数据,共12位,高位在前。

2.2器件使用

1)对应这类非标spi,可以通过模拟时序实现;

2)通过硬件spi实现,其中此器件手册也有专门介绍如何通过硬件spi驱动(其他像ADI的器件就很少有说明),如图。

a)读一个完整的12bit数据至少需要17个时钟周期,故意以8bit模式的spi下,最少需要24个时钟周期(3字节);

b)根据返回数据有效位,通过“移位”和“按位与”的方式提取有效数据。

2.3驱动代码

以stm32f1为例,以“spi抽象/硬件spi”中的spi封装代码为基础,驱动mcp3202。

 

#include "spi_core.h" #include "spi_hw.h" static struct spi_dev_device mcp3202_spi_dev; static struct spi_bus_device spi_bus0; static void spi0_cs(unsigned char state) { if (state) GPIO_SetBits(GPIOC, GPIO_Pin_4); else GPIO_ResetBits(GPIOC, GPIO_Pin_4); } void mcp3202_init(void) { GPIO_InitTypeDef GPIO_InitStructure; //spi cs RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC ,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_SetBits(GPIOC, GPIO_Pin_4); //device init stm32f1xx_spi_init(&spi_bus0,8,0,0); mcp3202_spi_dev.spi_cs = spi0_cs; mcp3202_spi_dev.spi_bus = &spi_bus0; } u16 mcp3202_read(u8 mode) { u8 send_buff[3],recv_buff[3]; send_buff[0] = 0x01; send_buff[1] = mode; send_buff[2] = 0x00; spi_send_recv(&mcp3202_spi_dev,send_buff,recv_buff,3); return (((recv_buff[1] << 8) | recv_buff[2])&0x0fff); }

代码简要分析:

 

1)stm32f1代码配置查看附件源码,配置参数与前面使用的一致,对于其他spi器件也是,几乎无须更改,注意速率和模式即可;

2)片选初始化;

3)用到的spi封装接口是“spi_send_recv”,通过器件时序图即可看出;

4)send_buff:第一字节0x01是启动位,第二字节mode为模式,第三字节为无关位,设置为0即可;

5)recv_buff:接收返回数据,并提取有效的12位数据。

3.参考源码

[1]  https://github.com/Prry/drivers-for-mcu

 

转载请注明原文地址: https://www.6miu.com/read-2350085.html

最新回复(0)