打印
[APM32F4]

【APM32F411V Tiny Board测评】-3-adc代码测试和压力薄膜传感器的驱动

[复制链接]
182|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chenqiguang1998|  楼主 | 2024-5-29 17:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 chenqiguang1998 于 2024-6-3 11:11 编辑

#申请原创# 在本次测评中,我们将对 APM32F411V Tiny Board 的 ADC 代码进行测试,并尝试驱动压力薄膜传感器。
一、引脚设置

首先,我们需要将压力薄膜传感器连接到 APM32F411V Tiny Board 的 ADC 引脚上。根据参考手册,我们可以将压力薄膜传感器的输出引脚连接到 APM32F411V Tiny Board 的 PA2 引脚上。

二、数据读取和转换代码

接下来,我们需要编写ADC代码来读取压力薄膜传感器的输出电压,并将其转换为压力值。以下是一个简单的ADC代码示例:
ADC_HandleTypeDef hadc1;

void MX_ADC1_Init(void) {
    ADC_ChannelConfTypeDef sConfig = {0};

    hadc1.Instance = ADC1;
    hadc1.Init.ScanConvMode = DISABLE;
    hadc1.Init.ContinuousConvMode = DISABLE;
    hadc1.Init.DiscontinuousConvMode = DISABLE;
    hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    hadc1.Init.NbrOfConversion = 1;
    DAL_ADC_Init(&hadc1);

    sConfig.Channel = ADC_CHANNEL_1;
    sConfig.Rank = 1U;
    sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
    DAL_ADC_ConfigChannel(&hadc1, &sConfig);
}

u16 Get_Adc(ADC_HandleTypeDef *hadc1)
{         
        while(!__DAL_ADC_GET_FLAG(&hadc1, ADC_FLAG_EOC ));//等待转换结束
        return DAL_ADC_GetValue(&hadc1); //返回最近一次ADC1规则组的转换结果
}

u16 Get_Adc_Average(ADC_HandleTypeDef *hadc1, u8 times) {
    u32 temp_sum = 0;
    u16 adc_value;
    u8 t;
    for(t = 0; t < times; t++) {
        adc_value = Get_Adc(hadc1);
        temp_sum += adc_value;
        DAL_Delay(5);
    }
    return (times > 1) ? (u16)(temp_sum / times) : adc_value;
}

压力薄膜传感器接在LM393上,有两个属出口,分别是A0(模拟量输出)和D0(高低电平输出),此处考虑到使用场景的精细度,使用ADC进行读取转换;
在代码中,我们假设压力与 ADC 值成线性关系,并使用一个简单的线性方程来进行转换计算。具体来说,我们使用了以下公式:
  • (x - in_min):计算输入值x与输入范围下限in_min之间的差值。
  • (out_max - out_min) / (in_max - in_min):计算输入范围和输出范围之间的比例关系。
  • 将步骤1的结果乘以步骤2的结果,得到一个与输入值x相对应的在输出范围内的偏移量。
  • 最后,将步骤3的结果加上输出范围的下限out_min,得到映射后的压力值。

这样,通过该函数就可以将压力传感器的数值转换为实际的压力值,从而实现对压力的测量和监测。


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;

}
接着我们进行代码的测试:
#define PRESS_MIN    20
#define PRESS_MAX    6000
#define VOLTAGE_MIN  150
#define VOLTAGE_MAX  3300

uint8_t state = 0;
uint16_t val = 0;
uint16_t value_AD = 0;

long PRESS_AO = 0;
int VOLTAGE_AO = 0;

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;
}

long readPressureSensor() {
    uint16_t value_AD = 0;
    uint16_t voltage_AO = 0;
    long pressure_AO = 0;

    value_AD = Get_Adc_Average(1, 10);  // 10次平均值
    voltage_AO = map(value_AD, 0, 4095, 0, 3300);

    if (voltage_AO < VOLTAGE_MIN) {
        pressure_AO = 0;
    } else if (voltage_AO > VOLTAGE_MAX) {
        pressure_AO = PRESS_MAX;
    } else {
        pressure_AO = map(voltage_AO, VOLTAGE_MIN, VOLTAGE_MAX, PRESS_MIN, PRESS_MAX);
    }

    return pressure_AO;
}



int main()
{
  long pressure=0;
    DAL_Init();
    SystemClock_Config();
    MX_ADC1_Init();
    while (1)
    {
        pressure = readPressureSensor();
        printf("Pressure: %.2f\n", pressure);
        DAL_Delay(1000);
    }
}







使用特权

评论回复
沙发
星辰大海不退缩| | 2024-6-22 20:56 | 只看该作者
驱动压力薄膜传感器?压力传感器应该是读取信息嘛?

使用特权

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

本版积分规则

10

主题

45

帖子

1

粉丝