打印

微芯MCP3202的使用和编程

[复制链接]
1379|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
有没有大神可以教我MCP3202的编程方法,可以给钱啊

使用特权

评论回复
沙发
zhuomuniao110| | 2019-4-12 18:36 | 只看该作者
mcp3202是Microchip(微芯科技)公司产的一款ADC芯片,成本低,使用方便。本文主要分析软件使用方面的特点及方法。

1.1器件特点

1)转换精度:12bit

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

3)伪差分输入

4)4线spi控制接口

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

1.2应用范围

1)传感器

2)过程控制

3)数据采集

4)电池供电系统

1.3器件基础框图

使用特权

评论回复
板凳
zhuomuniao110| | 2019-4-12 18:36 | 只看该作者
.器件使用(软件)

2.1时序图

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

时序图分析:

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

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

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

使用特权

评论回复
地板
zhuomuniao110| | 2019-4-12 18:37 | 只看该作者
2.2器件使用

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

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

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

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

使用特权

评论回复
5
zhuomuniao110| | 2019-4-12 18:38 | 只看该作者
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);
}

使用特权

评论回复
6
zhuomuniao110| | 2019-4-12 18:38 | 只看该作者
代码简要分析:

 

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

2)片选初始化;

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

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

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

使用特权

评论回复
7
zhuomuniao110| | 2019-4-12 18:38 | 只看该作者
网上帮你找的,你试试。

使用特权

评论回复
8
宸心尽向紫烟来|  楼主 | 2019-4-13 23:19 | 只看该作者
zhuomuniao110 发表于 2019-4-12 18:38
网上帮你找的,你试试。

好的,我试试,太感谢你了

使用特权

评论回复
9
externally| | 2019-4-15 21:26 | 只看该作者
网上应该找得到应用例程。

使用特权

评论回复
10
yiy| | 2019-4-16 22:09 | 只看该作者
这是什么单片机

使用特权

评论回复
11
宸心尽向紫烟来|  楼主 | 2019-4-19 19:33 | 只看该作者
yiy 发表于 2019-4-16 22:09
这是什么单片机

AD转换芯片

使用特权

评论回复
12
宸心尽向紫烟来|  楼主 | 2019-4-19 19:33 | 只看该作者
externally 发表于 2019-4-15 21:26
网上应该找得到应用例程。

嗯嗯,现在我已经会了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

87

帖子

0

粉丝