关于ADC_NbrOfChannel与ADC_RegularChannelConfig

,ADC_NbrOfChannel是设置要转换的总通道数,ADC_RegularChannelConfig()是配置各个通道,里面的第2个参数是你的通道名,第3个参数是这个通道名的转换顺序号,就是转换顺序怎么定义的,就是在第3个参数定义的,例,ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_5,2,ADC_SampleTime_239Cycles5);

void ADC_Peripheral_Init(ADC_TypeDef* ADCx) { uint32_t TimeOut = 0; ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); // ADC 模式配置 // 只使用一个ADC,属于单模式 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 扫描模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE ; // 连续转换模式 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; // 不用外部触发转换,软件开启即可 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 转换结果右对齐 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 转换通道个数 ADC_InitStructure.ADC_NbrOfChannel = ADC_NUM; // 初始化ADC ADC_Init(ADCx, &ADC_InitStructure); // 配置ADC时钟APBCLK2的8分频,即9MHz RCC_ADCCLKConfig(RCC_PCLK2_Div8); // 配置ADC 通道的转换顺序和采样时间 ADC_RegularChannelConfig(ADCx, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADCx, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADCx, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADCx, ADC_Channel_3, 4, ADC_SampleTime_55Cycles5); // 开启ADC ,并开始转换 ADC_Cmd(ADCx, ENABLE); // 初始化ADC 校准寄存器 ADC_ResetCalibration(ADCx); // 等待校准寄存器初始化完成 while(ADC_GetResetCalibrationStatus(ADCx) && (TimeOut < 2000)) { TimeOut++; } // ADC开始校准 ADC_StartCalibration(ADCx); TimeOut = 0; // 等待校准完成 while(ADC_GetCalibrationStatus(ADCx) && (TimeOut < 2000)) { TimeOut++; } // 使能ADC DMA 请求 ADC_DMACmd(ADCx, ENABLE); // 由于没有采用外部触发,所以使用软件触发ADC转换 ADC_SoftwareStartConvCmd(ADCx, ENABLE); } 1. 上面的代码是STM32F103系列的,把它改成STM32F405系列标准库形式的
04-04
#include "soil_moisture.h" #include "stm32f10x_adc.h" #define SOIL_DRY_ADC 3800 #define SOIL_WET_ADC 1200 void SoilMoisture_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_239Cycles5); ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); } uint16_t Get_SoilMoisture_ADC(void) { ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); return ADC_GetConversionValue(ADC1); } uint8_t Get_SoilMoisture_Percent(void) { uint16_t adc_val = Get_SoilMoisture_ADC(); int32_t numerator = (int32_t)(SOIL_DRY_ADC - adc_val); int32_t denominator = (SOIL_DRY_ADC - SOIL_WET_ADC); int32_t percent = (numerator * 100) / denominator; return (percent > 100) ? 100 : ((percent < 0) ? 0 : percent); }运行之后OLED上数据一直是000,没有检测到土壤湿度数据,并且土壤二字出现乱码,需要在哪些文件下修改代码
04-01
#include "soil_moisture.h" #include "delay.h" void SoilMoisture_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); } uint16_t Get_SoilMoisture_ADC(void) { ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_239Cycles5); ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); return ADC_GetConversionValue(ADC1); } uint8_t Get_SoilMoisture_Percent(void) { uint16_t adc_val = Get_SoilMoisture_ADC(); return 100 - (adc_val * 100 / 4095); } void SoilSensor_PowerControl(FunctionalState state) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_WriteBit(GPIOC, GPIO_Pin_0, (state == ENABLE) ? Bit_SET : Bit_RESET); }如何用Risym 1路5V继电器控制土壤湿度检测器,代码如何修改,5V电压已被占用
03-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值