为什么我的微处理器无法读取模拟电位计值

问题描述 投票:0回答:1

我正在编写一个 stm32f401cb 代码,它将根据模拟到数字转换的电位计值来控制 LED。我的 pa2 已被选为模拟输入。我的 pb2 已被选为通用输出,它连接到 LED My proteus schematic

我认为我的 adc 不会将模拟值转换为数字,因为我的 LED 无论如何都不会转动。我已经尝试了所有电阻值,但都相同。为什么会这样?通常当电位器值大于 4300 时,我的 LED 应该打开 我的 LED 无论如何也打不开

#include "stm32f4xx.h"
uint16_t value=0;

void gpioa_config(void) {
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    GPIO_InitTypeDef gpioa_init_struct;
    gpioa_init_struct.GPIO_Pin=GPIO_Pin_2;
    gpioa_init_struct.GPIO_Mode=GPIO_Mode_AN;
    gpioa_init_struct.GPIO_OType=GPIO_OType_PP;
    gpioa_init_struct.GPIO_PuPd=GPIO_PuPd_NOPULL;
    gpioa_init_struct.GPIO_Speed=GPIO_Speed_25MHz;
    GPIO_Init(GPIOA,&gpioa_init_struct);
}

void gpiob_config(void) {
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
    GPIO_InitTypeDef gpiob_init_struct;
    gpiob_init_struct.GPIO_Pin=GPIO_Pin_2;
    gpiob_init_struct.GPIO_Mode=GPIO_Mode_OUT;
    gpiob_init_struct.GPIO_OType=GPIO_OType_PP;
    gpiob_init_struct.GPIO_PuPd=GPIO_PuPd_NOPULL;
    gpiob_init_struct.GPIO_Speed=GPIO_Speed_25MHz;
    GPIO_Init(GPIOB,&gpiob_init_struct);
}

void adc_config() {
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
    ADC_InitTypeDef adc_init_struct;
    ADC_CommonInitTypeDef adc_common_init_struct;
    adc_common_init_struct.ADC_DMAAccessMode=ADC_DMAAccessMode_Disabled;
    adc_common_init_struct.ADC_Mode=ADC_Mode_Independent;
    adc_common_init_struct.ADC_Prescaler=ADC_Prescaler_Div8;
    ADC_CommonInit(&adc_common_init_struct);

    adc_init_struct.ADC_Resolution=ADC_Resolution_12b;
    ADC_Init(ADC1,&adc_init_struct);
    ADC_Cmd(ADC1,ENABLE);
}
uint16_t adc_read() {
    ADC_RegularChannelConfig(ADC1,ADC_Channel_2,1,ADC_SampleTime_480Cycles);
    ADC_SoftwareStartConv(ADC1);

    while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET) {

    }

    return ADC_GetConversionValue(ADC1);
}

int main(void)
{
    gpioa_config();
    gpiob_config();
    adc_config();
    GPIO_ResetBits(GPIOB,GPIO_Pin_2);

  while (1)
  {
      value=adc_read();
      if (value>4300) {
          GPIO_SetBits(GPIOB,GPIO_Pin_2);
      }
      else {
          GPIO_ResetBits(GPIOB,GPIO_Pin_2);
      }
  }
}
stm32 stm32f4discovery stm32f4 stm32cubeide stm32cubemx
1个回答
0
投票

我认为你的问题源于这样一个事实:你的 ADC 是 12 位 0-4096,并且默认硬件缩放是字的低端。您的电位计永远无法达到返回 4300 的电压(高于满量程)!

尝试一些更中档的值,例如 2048 或 1024,你应该会得到正确的行为。

如果您不这样做,那么检查 ADC 是否工作的简单方法是延迟您上次从 ADC 读取的量,并使用小型扬声器或水晶耳机切换输出位。然后你就可以听到改变锅位置的效果。点亮或不点亮 LED 有点太二元化了。标记空间比是另一种信号发送方式(即根据电位计位置改变 LED 的表观亮度)。

© www.soinside.com 2019 - 2024. All rights reserved.