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

[复制链接]
 楼主| 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代码示例:
  1. ADC_HandleTypeDef hadc1;

  2. void MX_ADC1_Init(void) {
  3.     ADC_ChannelConfTypeDef sConfig = {0};

  4.     hadc1.Instance = ADC1;
  5.     hadc1.Init.ScanConvMode = DISABLE;
  6.     hadc1.Init.ContinuousConvMode = DISABLE;
  7.     hadc1.Init.DiscontinuousConvMode = DISABLE;
  8.     hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  9.     hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  10.     hadc1.Init.NbrOfConversion = 1;
  11.     DAL_ADC_Init(&hadc1);

  12.     sConfig.Channel = ADC_CHANNEL_1;
  13.     sConfig.Rank = 1U;
  14.     sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  15.     DAL_ADC_ConfigChannel(&hadc1, &sConfig);
  16. }

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

  22. u16 Get_Adc_Average(ADC_HandleTypeDef *hadc1, u8 times) {
  23.     u32 temp_sum = 0;
  24.     u16 adc_value;
  25.     u8 t;
  26.     for(t = 0; t < times; t++) {
  27.         adc_value = Get_Adc(hadc1);
  28.         temp_sum += adc_value;
  29.         DAL_Delay(5);
  30.     }
  31.     return (times > 1) ? (u16)(temp_sum / times) : adc_value;
  32. }

压力薄膜传感器接在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,得到映射后的压力值。

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


  1. long map(long x, long in_min, long in_max, long out_min, long out_max)
  2. {

  3. return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;

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

  5. uint8_t state = 0;
  6. uint16_t val = 0;
  7. uint16_t value_AD = 0;

  8. long PRESS_AO = 0;
  9. int VOLTAGE_AO = 0;

  10. long map(long x, long in_min, long in_max, long out_min, long out_max) {
  11.     return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
  12. }

  13. long readPressureSensor() {
  14.     uint16_t value_AD = 0;
  15.     uint16_t voltage_AO = 0;
  16.     long pressure_AO = 0;

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

  19.     if (voltage_AO < VOLTAGE_MIN) {
  20.         pressure_AO = 0;
  21.     } else if (voltage_AO > VOLTAGE_MAX) {
  22.         pressure_AO = PRESS_MAX;
  23.     } else {
  24.         pressure_AO = map(voltage_AO, VOLTAGE_MIN, VOLTAGE_MAX, PRESS_MIN, PRESS_MAX);
  25.     }

  26.     return pressure_AO;
  27. }



  1. int main()
  2. {
  3.   long pressure=0;
  4.     DAL_Init();
  5.     SystemClock_Config();
  6.     MX_ADC1_Init();
  7.     while (1)
  8.     {
  9.         pressure = readPressureSensor();
  10.         printf("Pressure: %.2f\n", pressure);
  11.         DAL_Delay(1000);
  12.     }
  13. }







星辰大海不退缩 发表于 2024-6-22 20:56 | 显示全部楼层
驱动压力薄膜传感器?压力传感器应该是读取信息嘛?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

59

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

10

主题

59

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部