基于GD32单片机的12位ADC压力采集(50kg压力),附源码和原理图

这篇具有很好参考价值的文章主要介绍了基于GD32单片机的12位ADC压力采集(50kg压力),附源码和原理图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1,静止状态下采集的各项数值:

上位机监测到的ADC采集到的数据,该处采集的电压值是3.287mv,电压及压力值如下图:

adc检测压力传感器原始值,单片机,嵌入式硬件

 示波器采集的电压值:3.26V,与上述单片机采集的数值基本一致

adc检测压力传感器原始值,单片机,嵌入式硬件

 2,施加一定压力下采集的各项数值:

上位机监测到的ADC采集到的数据,该处采集的电压值是2.454mv,电压及压力值如下图:

adc检测压力传感器原始值,单片机,嵌入式硬件

 示波器采集的电压值:2.50V,与上述单片机采集的数值基本一致

adc检测压力传感器原始值,单片机,嵌入式硬件

 3,我们来看看其原理图,VCC这里接的是3.3V,U4便是我们的待测压力传感器,使用PA1的ADC0通道一进行检测:

adc检测压力传感器原始值,单片机,嵌入式硬件

4,源码,这里面加了均值滤波,电压,压力转换函数,用户只需要调用Get_Frc()接口函数即可,源码如下:

bsp_adc.c文件

#include "bsp_adc.h"
#include "bsp_usart.h"
#include "stdio.h"

/*********************************FSRADC*************************************************/
#define PRESS_MIN 20   // 最小量程 20g
#define PRESS_MAX 49999 // 最大量程 50kg  以具体型号的数据手册为准

#define VOLTAGE_MIN 1150 // 有效电压范围 可调节 这里指的是1.33V到3.28V
#define VOLTAGE_MAX 3280

long PRESS_AO = 0;
/**********************************************************
 * 函 数 名 称:adc_config
 * 函 数 功 能:ADC初始化
 * 传 入 参 数:无
 * 函 数 返 回:无
 * 作       者:
 * 备       注:无
 **********************************************************/
void adc_config(void)
{
    // 使能引脚时钟
    rcu_periph_clock_enable(RCU_GPIOC);
    // 使能ADC时钟
    rcu_periph_clock_enable(RCU_ADC0);
    // 配置ADC时钟
    adc_clock_config(ADC_ADCCK_PCLK2_DIV4);

    // 配置引脚为模拟输入模式
    gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_1);

    // 配置ADC为独立模式
    adc_sync_mode_config(ADC_SYNC_MODE_INDEPENDENT);

    // 使能扫描模式
    adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);

    // 数据右对齐
    adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);

    // ADC0设置为12位分辨率
    adc_resolution_config(ADC0, ADC_RESOLUTION_12B);

    // ADC0设置为规则组  一共使用 1 个通道
    adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1);

    // ADC外部触发禁用, 即只能使用软件触发
    adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, EXTERNAL_TRIGGER_DISABLE);

    // ADC0使能
    adc_enable(ADC0);

    // 开启ADC自校准
    adc_calibration_enable(ADC0);
}

/**********************************************************
 * 函 数 名 称:Get_ADC_Value
 * 函 数 功 能:读取ADC值
 * 传 入 参 数:ADC_CHANNEL_x=要采集的通道
 * 函 数 返 回:测量到的值
 * 作       者:LiangXia
 * 备       注:无
 **********************************************************/
unsigned int Get_ADC_Value(uint8_t ADC_CHANNEL_x)
{
    unsigned int adc_value = 0;
    // 设置采集通道
    adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_x, ADC_SAMPLETIME_15);
    // 开始软件转换
    adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
    // 等待 ADC0 采样完成
    while (adc_flag_get(ADC0, ADC_FLAG_EOC) == RESET)
    {
        ;
    }
    // 读取采样值
    adc_value = adc_regular_data_read(ADC0);
    // 返回采样值
    return adc_value;
}

/**********************************************************
 * 函 数 名 称:map
 * 函 数 功 能:ADC函数处理
 * 传 入 参 数:待测值 x,   输入最大最小值:in_min,in_max,    输出最大最小值:out_min,out_max
 * 函 数 返 回:处理后的值
 * 作       者:LiangXia
 * 备       注:无
 **********************************************************/
long map(long x, long in_min, long in_max, long out_min, long out_max)
{
    return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

/**********************************************************
 * 函 数 名 称:Get_Adc_Average
 * 函 数 功 能:均值滤波
 * 传 入 参 数:通道
 * 函 数 返 回:均值滤波处理后的值
 * 作       者:LiangXia
 * 备       注:无
 **********************************************************/
uint16_t Get_Adc_Average(uint8_t ch)
{
    uint32_t temp_val = 0;
    uint8_t t;
    for (t = 0; t < 40; t++)
    {
        temp_val += Get_ADC_Value(ch);
        delay_1ms(5);
    }
    return temp_val / 40;
}

/**********************************************************
 * 函 数 名 称:Get_Frc
 * 函 数 功 能:压力测试
 * 传 入 参 数:无
 * 函 数 返 回:无
 * 作       者:LiangXia
 * 备       注:无
 **********************************************************/
void Get_Frc()
{
    /* value convert */
    int VOLTAGE_AO = map(Get_Adc_Average(ADC_CHANNEL_1), 0, 4095, 0, 3300); // 前两位是采集ADC值(一般是0-4095,此处实际测试是2374-3907)  后两位是电压值
    if (VOLTAGE_AO < VOLTAGE_MIN)
    {
        PRESS_AO = PRESS_MAX;
    }
    else if (VOLTAGE_AO > VOLTAGE_MAX)
    {
        PRESS_AO = 0;
    }
    else
    {
        PRESS_AO = map(VOLTAGE_AO, VOLTAGE_MAX, VOLTAGE_MIN, PRESS_MIN, PRESS_MAX);
    }
    delay_1ms(10);
    printf("\r\n ADC data = %d \r\n", Get_Adc_Average(ADC_CHANNEL_1));
    printf("\r\n VOLTAGE data = %dmv \r\n", VOLTAGE_AO);
    printf("\r\n PRESS data = %dg \r\n", PRESS_AO);
}

bsp_adc.h文件

#ifndef __BSP_ADC_H
#define __BSP_ADC_H

#include "gd32f4xx.h"

void adc_config(void);
void Get_Frc();

#endif

上面代码有问题的请评论区评论指出,非常感谢,创作不易,还望点赞!文章来源地址https://www.toymoban.com/news/detail-855485.html

到了这里,关于基于GD32单片机的12位ADC压力采集(50kg压力),附源码和原理图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • K_A12_004 基于STM32等单片机采集人体红外感应(HC-SR501)模块串口与OLED0.96双显示

    单片机型号 测试条件 模块名称 代码功能 STC89C52RC 晶振11.0592M HC-SR501模块 STC89C52RC采集HC-SR501模块参数 串口与OLED0.96双显示 STM32F103C8T6 晶振8M/系统时钟72M HC-SR501模块 STM32F103C8T6采集HC-SR501模块参数 串口与OLED0.96双显示 其他资料目录 直戳跳转 HC-SR501模块 引脚说明 VCC 正极 3.3-5V供电

    2024年01月19日
    浏览(50)
  • 【GD32单片机】GD32工程构建,快速上手GD32

    之前在学校接触最多的是STM32单片机,但出来工作后发现,GD32或MM32单片机却是经常能接触到的,虽然学习资料和生态没有STM32好,但基本芯片内外设资源却差不多,开发起来大同小异。 在开始构建工程之前需要去GD32的官网下载一些资料; 打开官网 https://www.gigadevice.com.cn/ 选

    2024年02月03日
    浏览(47)
  • GD32单片机和STM32单片机的对比分析

    GD32单片机和STM32单片机都是基于Arm Cortex-M3/M4内核的32位通用微控制器,广泛应用于各种嵌入式系统和物联网领域。两者之间有很多相似之处,但也有一些不同之处,本文将从以下几个方面对比分析两者的特点、优势和开发成本。 GD32单片机采用的是二代的M3/M4内核,而STM32单片

    2024年02月16日
    浏览(57)
  • 单片机ADC3.3V采集10V电压

    自记: 如下图所示,使用两个电阻分压,阻值可取为2:1,分压后得到信号源1/3的电压,这样可以将0-10V之间变化的信号变成0-3.33V之间变化的信号。如下图所示,为最基本的电阻分压采样原理图。我使用了2K和1K电阻分压。     仿真波形如下图所示。 对上图进行完善,使用

    2024年02月04日
    浏览(42)
  • GD32单片机串口DMA发送

    一:在使用GD32单片机进行串口DMA发送时,需要进行以下配置: 使能 DMA 时钟和 串口时钟 。 配置 DMA通道 ,包括数据 方向 、数据 宽度 、传输 模式 等参数。 配置串口发送端口 GPIO 的模式和引脚。 配置串口的 基本参数 ,如波特率、数据位、停止位、校验位等。 配置串口D

    2024年02月12日
    浏览(41)
  • 山东大学单片机原理与应用实验 3.8 ADC0808/9信号采集实验

    目录 一、实验题目 二、实验要求 三、实验过程及结果分析 四、实验流程图 五、实验源代码 3.8 ADC0808信号采集实验 1、画出实验的流程图 2、编写源程序并进行注释 3、记录实验过程 4、记录程序运行结果截图 利用LCD1602和AD0808实现简单的交流信号过零检测与频率分析。要求信

    2024年02月07日
    浏览(45)
  • STC8H8K64U单片机-ADC采集数

    配置单片机的ADC时一定要将IO口配置成高阻输入模式, 以下是单片机引脚对应的ADC通道  

    2024年02月07日
    浏览(39)
  • 单片机移植freemodbus主机(STM32、GD32、瑞萨、国民技术等)

    从github下载:https://github.com/armink/FreeModbus_Slave-Master-RTT-STM32 无法下载或者下载太慢可以用资源下载,无需积分。freeModbus主机源码下载 示例代码 参考从机代码创建 将FreeModbus主机源代码拷贝到工程中间件-第三方库-freemodbus源码库:即MiddlewaresThird_PartyFreeModbusMaster文件夹中。

    2024年02月11日
    浏览(42)
  • GD32 单片机 硬件I2C死锁解决方法

    在I2C恢复函数下个断点(检测到I2C多次超时之后,应该能跳转到I2C恢复函数) 使用镊子,将SCL与SDA短接,很快就能看到程序停到恢复函数的断点上,此时再执行恢复函数,看能否正常走出(可在回复函数中写个死循环,只有I2C正常才跳出,检测I2C正常的办法,可以读从设备的

    2024年02月05日
    浏览(61)
  • 【GD32】从0开始学GD32单片机(10)—— TIMER基本定时器详解+1毫秒延时例程

    在GD32中定时器是非常重要的外设,它可以帮我们精准的控制程序的调度,就如之前讲过的SysTick就是一个定时器,我们可以通过设置这个定时器的寄存器实现延时函数。 GD32的定时器可大致分为3种—— 基本定时器、通用定时器、高级定时器 。 它们之间的区别如下图所示: 这

    2024年01月17日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包