我正在编写一个 stm32f401cb 代码,它将根据模拟到数字转换的电位计值来控制 LED。我的 pa2 已被选为模拟输入。我的 pb2 已被选为通用输出,它连接到 LED
我认为我的 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);
}
}
}
我认为你的问题源于这样一个事实:你的 ADC 是 12 位 0-4096,并且默认硬件缩放是字的低端。您的电位计永远无法达到返回 4300 的电压(高于满量程)!
尝试一些更中档的值,例如 2048 或 1024,你应该会得到正确的行为。
如果您不这样做,那么检查 ADC 是否工作的简单方法是延迟您上次从 ADC 读取的量,并使用小型扬声器或水晶耳机切换输出位。然后你就可以听到改变锅位置的效果。点亮或不点亮 LED 有点太二元化了。标记空间比是另一种信号发送方式(即根据电位计位置改变 LED 的表观亮度)。