龙芯1B:adc测量电压例程

目录


前言

一、adc的参数及基本步骤?

二、读取转换电压

1.基本思想

2.龙芯adc

3.adc编程示例

4.龙芯adc检测电压示例代码

总结


前言

学嵌入式这行,人人都知模数转换、数模转换。adc就是模数转换器的英文简称。本文章旨在学习,如有错误,欢迎指正;内容部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉!

一、adc的参数及基本步骤?

首先经过采样、量化、编码。如采样定理:当采样频率大于模拟信号频率max的两倍时,采样的值才能不失真的反映最原始的模拟信号数据。

adc的主要参数:转换精度、分辨率、转化误差、转换速度。

1.分辨率
数字量变化一个最小量时模拟信号的变化量,定义为满刻度与2n的比值,通常以数字信号的位数来表示。
2.转换速率
转换速率是单位时间内完成A/D转换的次数.
3.采样速率
采样速率是两次采样(两次转换)的间隔时间的倒数,为了保证转换的正确完成,一般采样速率必须小于等于转换速率,即采样时间大于等于转换时间。

二、读取转换电压

1.基本思想

adc的值是从0到4095的,adc接到GND,读出来必然是0,接到VCC必然是4095;需要事先定义好量程和分辨率。量程其实就是基准电压,以5V电压为基准,那么测量的范围就是0V~5V;分辨率就是测量的精度了,假如12位,12位二进制最大值为4095;这时候就可以知道0V=0,5V=4095了,把5V分为4095份就可以了;再配合相应的滤波算法,自然可以很好的写出转化的电压.

2.龙芯adc

源代码:ls1x‐drv/i2c/ads1015/ ads1015.c

头文件:ls1x‐drv/include/i2c/ ads1015.h

ADS1015 是否使用,在 bsp.h 中配置宏定义:

#define ADS1015_DRV

ADS1015 挂接在 I2C0 上,I2C 地址和通信速率定义如下(ads1015.c):

#define ADS1015_ADDRESS         0x48             /* 7 位地址 */

#define ADS1015_BAUDRATE        100000           /* 100K */

int ADS1015_read(void *dev, void *buf, int size, void *arg); 读数据

int ADS1015_ioctl(void *dev, int cmd, void *arg);

 ADS1015_read:读取当前 ADC 转换结果,buf 是 unsigned short 类型。

ADS1015_ioctl:设置转换模式。

实用函数:

uint16_t get_ads1015_adc(void *bus, int channel); 读一个通道的 ADC 值

3.adc编程示例

     uint16_t val;
     float vin;
     val = get_ads1015_adc(busI2C0, ADS1015_REG_CONFIG_MUX_SINGLE_0); // 读通道 0
     vin = 0.002 * val;       /* 0.002 是电压值校正系数 */
     printf("ADS1015_IN0 = 0x%04X, voltage=%6.3f\r\n\r\n", val, vin);
     ADS1015_ioctl(busI2C0, ADS1015_DISP_CONFIG_REG, NULL);            // 显示

4.龙芯adc检测电压示例代码

#include <stdio.h>
#include "ls1b.h"
#include "mips.h"

//-------------------------------------------------------------------------------------------------
// BSP
//-------------------------------------------------------------------------------------------------

#include "bsp.h"

#ifdef BSP_USE_FB
  #include "ls1x_fb.h"
  #ifdef XPT2046_DRV
    char LCD_display_mode[] = LCD_800x480;
  #elif defined(GT1151_DRV)
    char LCD_display_mode[] = LCD_800x480;
  #else
    #error "在bsp.h中选择配置 XPT2046_DRV 或者 GT1151_DRV"
           "XPT2046_DRV:  用于800*480 横屏的触摸屏."
           "GT1151_DRV:   用于480*800 竖屏的触摸屏."
           "如果都不选择, 注释掉本 error 信息, 然后自定义: LCD_display_mode[]"
  #endif
#endif
#include "ls1x_i2c_bus.h"
#include "i2c/ads1015.h"
#include "i2c/mcp4725.h"
#include "ls1b_gpio.h"

//-------------------------------------------------------------------------------------------------
// 主程序
//-------------------------------------------------------------------------------------------------

int main(void)
{
    printk("\r\nmain() function.\r\n");

    ls1x_drv_init();            		/* Initialize device drivers */
    ls1x_mcp4725_ioctl(busI2C0,IOCTL_MCP4725_DISP_CONFIG_REG,NULL);
    ls1x_ads1015_ioctl(busI2C0,IOCTL_ADS1015_DISP_CONFIG_REG,NULL);
    printk("\n");
    char tbuf1[50]={0},tbuf2[50]={0},sbuf1[50]={0},sbuf2[50]={0},rt;
    unsigned short dac=0, adc1=0, adc2=0;
    float out_v,in_v1,in_v2;
    //gpio_enable(47, DIR_OUT);
    //gpio_write(47, 1);
    
    /*
     * 裸机主循环
     */
    for (;;)
    {

        adc1 = get_ads1015_adc(busI2C0, ADS1015_REG_CONFIG_MUX_SINGLE_0);
        adc2 = get_ads1015_adc(busI2C0, ADS1015_REG_CONFIG_MUX_SINGLE_1);
        in_v1 = 4.096*2*adc1/4096;//采集电压的转换公式
        in_v2 = 4.096*2*adc2/4096;//采集电压的转换公式
        sprintf((char *)sbuf1,"ADS1015采集到的电压值: adc = %fV",in_v1);
        sprintf((char *)sbuf2,"ADS1015采集到的电压值: adc = %fV",in_v2);
        printk("%s\n%s\n\n",tbuf1,sbuf1);
        printk("%s\n%s\n\n",tbuf2,sbuf1);

        fb_textout(10, 60, "ADS1015 ADC GET");
        fb_fillrect(10, 80, 480, 96, cidxBLACK);
        fb_fillrect(10, 100, 500, 116, cidxBLACK);
	    fb_textout(10, 80, sbuf1);
	    fb_textout(10, 100, sbuf2);
	    delay_ms(500);
    }

    return 0;
}

联系我们

        vx ——>  buildupup     公众号   嵌入式up   如果文章对您有帮助,请打赏一元呗,感谢支持,分享不易,码字不易。希望对大家帮助!


成功就是一把梯子,双手插在口袋的人是爬不上去的。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值