int main(void) { LED_Init(); ADC1_Init(); printf("\n\r ADC 测试实验 \r"); while (1) { ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3; printf("\r\n 当前电压采集值16进制表示 = 0x%04X \r\n", ADC_ConvertedValue); printf("\r\n 当前电压的模拟值= %f V \r\n",ADC_ConvertedValueLocal); GPIO_ResetBits(GPIOB,GPIO_Pin_5); // printf("LED灯亮,系统ADC正常 \n"); Delay_ms(500); } }
时间: 2023-10-30 13:08:15 浏览: 132
这是一段基于STM32的ADC测试程序,主要功能是读取ADC采集的电压值并输出到串口,同时控制LED灯闪烁表示程序正常运行。
程序主要流程如下:
1. 初始化LED和ADC模块。
2. 进入主循环,不断读取ADC采集的电压值并计算其模拟值。
3. 将采集的电压值和计算出的模拟值输出到串口。
4. 控制LED灯闪烁,表示程序正常运行。
需要注意的是,程序中使用了延时函数Delay_ms(),这是一个自定义的延时函数,用于实现程序中的延时等待功能。另外,程序中还使用了GPIO_ResetBits()函数控制LED灯的亮灭。
如果您有关于该程序的具体问题或需要进一步的解释,请具体描述您的问题,我会尽力帮助解决。
相关问题
#include "bflb_adc.h" #include "bflb_mtimer.h" #include "board.h" #define PRESS_MIN 20 #define PRESS_MAX 6000 #define VOLTAGE_MIN 150 #define VOLTAGE_MAX 3300 struct bflb_adc_channel_s chan[] = { { .pos_chan = ADC_CHANNEL_2, .neg_chan = ADC_CHANNEL_GND } }; u8 state = 0; u16 val = 0; u16 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); int main(void) { bflb_platform_init(); bflb_adc_init(); bflb_adc_channel_config(chan, ARRAY_SIZE(chan)); bflb_adc_enable(); bflb_mtimer_init(); printf("Test start\n"); while (1) { bflb_adc_get_data(chan, ARRAY_SIZE(chan), &value_AD); VOLTAGE_AO = map(value_AD, 0, 4095, 0, 3300); if (VOLTAGE_AO < VOLTAGE_MIN) { PRESS_AO = 0; } else if (VOLTAGE_AO > VOLTAGE_MAX) { PRESS_AO = PRESS_MAX; } else { PRESS_AO = map(VOLTAGE_AO, VOLTAGE_MIN, VOLTAGE_MAX, PRESS_MIN, PRESS_MAX); } printf("AD value = %d, voltage = %d mV, pressure = %ld g\n", value_AD, VOLTAGE_AO, PRESS_AO); bflb_mdelay(500); } } 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; }注释该代码
这是一段使用芯片内置ADC模块读取压力传感器输出压缩值并转换为压力值的代码。主要包含以下步骤:
1. 包含需要的头文件:bflb_adc.h, bflb_mtimer.h, board.h
2. 定义压力和电压的最小最大值
3. 定义ADC通道结构体数组
4. 定义变量:状态state,采集到的AD值val,转换后的AD值value_AD,转换后的压力值PRESS_AO,转换后的电压值VOLTAGE_AO
5. 声明map函数,用于将输入的数值从一个范围映射到另一个范围
6. 在主函数中初始化平台、ADC模块、定时器,并进入循环
7. 在循环中,使用ADC模块采集压力传感器输出的AD值
8. 将采集到的AD值转换为电压值,并根据电压值计算出压力值
9. 打印采集到的AD值、电压值和压力值
10. 等待500毫秒后再次进入循环
注释中对每一行代码进行了简单的说明。
该代码在没有头文件bl_delay.h的情况下怎么修改#include "bl_mcu_sdk.h"#include "bl_gpio.h"#include "bl_adc.h"#include "bl_uart.h"#include "bl_delay.h"#define PRESS_MIN 20#define PRESS_MAX 6000#define VOLTAGE_MIN 150#define VOLTAGE_MAX 3300long map(long x, long in_min, long in_max, long out_min, long out_max);int main(void){ // 初始化延时函数 bl_delay_init(); // 初始化串口 bl_uart_init(0, 9600, UART_BITWIDTH_8BIT, UART_STOP_BIT_1, UART_PARITY_DISABLE); // 初始化ADC bl_adc_init(ADC_CLK_DIV_2, ADC_RESOLUTION_12BIT, ADC_SCALE_4096, ADC_INPUT_MODE_SINGLE, ADC_ATVCC); bl_delay_ms(1000); bl_uart_printf("Test start\n"); while(1) { // 获取ADC采样值 uint16_t value_AD = bl_adc_single_get_value(ADC_0, ADC_CHANNEL_1); // 转换为电压值 int VOLTAGE_AO = map(value_AD, 0, 4095, 0, 3300); if(VOLTAGE_AO < VOLTAGE_MIN) { PRESS_AO = 0; } else if(VOLTAGE_AO > VOLTAGE_MAX) { PRESS_AO = PRESS_MAX; } else { // 根据电压值计算压力值 PRESS_AO = map(VOLTAGE_AO, VOLTAGE_MIN, VOLTAGE_MAX, PRESS_MIN, PRESS_MAX); } // 输出结果 bl_uart_printf("AD value = %d, voltage = %d mV, pressure = %ld g\n", value_AD, VOLTAGE_AO, PRESS_AO); // 延时500ms bl_delay_ms(500); }}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;}
如果你没有头文件 bl_delay.h,你需要自己实现延时函数,或者使用其他的延时函数库。你可以在代码中定义自己的延时函数,例如:
```c
void delay_ms(uint32_t ms) {
for (uint32_t i = 0; i < ms; i++) {
for (uint32_t j = 0; j < 2000; j++) {
__asm("nop");
}
}
}
```
然后在主函数中使用该延时函数代替 bl_delay_ms()。
```c
int main(void){
// 初始化串口
bl_uart_init(0, 9600, UART_BITWIDTH_8BIT, UART_STOP_BIT_1, UART_PARITY_DISABLE);
// 初始化ADC
bl_adc_init(ADC_CLK_DIV_2, ADC_RESOLUTION_12BIT, ADC_SCALE_4096, ADC_INPUT_MODE_SINGLE, ADC_ATVCC);
delay_ms(1000);
bl_uart_printf("Test start\n");
while(1)
{
// 获取ADC采样值
uint16_t value_AD = bl_adc_single_get_value(ADC_0, ADC_CHANNEL_1);
// 转换为电压值
int VOLTAGE_AO = map(value_AD, 0, 4095, 0, 3300);
if(VOLTAGE_AO < VOLTAGE_MIN)
{
PRESS_AO = 0;
}
else if(VOLTAGE_AO > VOLTAGE_MAX)
{
PRESS_AO = PRESS_MAX;
}
else
{
// 根据电压值计算压力值
PRESS_AO = map(VOLTAGE_AO, VOLTAGE_MIN, VOLTAGE_MAX, PRESS_MIN, PRESS_MAX);
}
// 输出结果
bl_uart_printf("AD value = %d, voltage = %d mV, pressure = %ld g\n", value_AD, VOLTAGE_AO, PRESS_AO);
// 延时500ms
delay_ms(500);
}
}
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;
}
```
阅读全文