本帖最后由 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);
- }
- }
|