|
用的是YL-69 4線的土壤濕度檢測,連接的A0口模擬輸入adc檢測, 電路如下
電路.jpg (4.17 MB, 下載次數: 36)
下載附件
2022-4-4 21:41 上傳
問題如圖,檢測出的結果上面的數據為直接得到ADC返回電壓 adc代碼中 Get_Adc(u8 ch) 函數的返回值
下面的數據為 取10次的平均電壓后在進行公式計算得到的結果,公式為 shidu1=(4092-temp_val)/3292*100; 但是得到的數據只有240、40來回變(Get_Adc_Average(u8 ch,u8 times)該函數返回值)
ps 我按上面公式反著來計算也達不到一樣的值啊
土壤濕度檢測結果.jpg (4.56 MB, 下載次數: 33)
下載附件
2022-4-4 21:33 上傳
土壤濕度檢測結果2.jpg (4.51 MB, 下載次數: 36)
下載附件
2022-4-4 21:33 上傳
ADC的代碼
- #include "adc.h"
- #include "delay.h"
- int shidu1;
- void Adc_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- ADC_InitTypeDef ADC_InitStruct;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);
- /*PA_1éèÖÃÎaÄ£Äaêäèë*/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- RCC_ADCCLKConfig(RCC_PCLK2_Div6);
-
- ADC_DeInit(ADC1);//¸′λADC
-
- //3õê¼»ˉADC2Îêy
- ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;
- ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;
- ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
- ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;
- ADC_InitStruct.ADC_NbrOfChannel=1;
- ADC_InitStruct.ADC_ScanConvMode=DISABLE;
-
- ADC_Init(ADC1, &ADC_InitStruct);
-
- ADC_Cmd(ADC1,ENABLE);
-
- ADC_ResetCalibration(ADC1);
-
- while(ADC_GetResetCalibrationStatus(ADC1));
-
- ADC_StartCalibration(ADC1);
-
- while(ADC_GetCalibrationStatus(ADC1));
-
- }
- u16 Get_Adc(u8 ch)
- {
-
- ADC_RegularChannelConfig(ADC1,ch,1, ADC_SampleTime_239Cycles5);
-
- ADC_SoftwareStartConvCmd(ADC1,ENABLE);
-
- while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
-
- return ADC_GetConversionValue(ADC1);
- }
- u16 Get_Adc_Average(u8 ch,u8 times)
- {
- u32 temp_val=0;
- u8 t;
- for(t=0;t<times;t++)
- {
- temp_val+=Get_Adc(ch);
- delay_ms(1);
- }
- temp_val=temp_val/times;
- shidu1=(4092-temp_val)/3292*100;
- return shidu1;
- }
復制代碼
主函數代碼
- #include"stm32f10x.h"
- #include "delay.h"
- #include "led.h"
- #include "i2c.h"
- #include "oled.h"
- #include "GUI.h"
- #include "dht11.h"
- #include "SGP30.h"
- #include "adc.h"
- int shidu;
- int main(void)
- {
- u8 soliHumi,s1;
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)
-
- delay_init()
- LED_Init()
- IIC_Init()
- OLED_Init()
- OLED_Clear(0)
- OLED_display_string_8x16(0,0,"SYSTEM INIT");
- OLED_display_string_8x16(0,16,"OLED INIT");
-
- Adc_Init();
- OLED_display_string_8x16(0,64,"YL-69 INIT");
- delay_ms(50);
- OLED_Clear(0);
- OLED_display_string_8x16(0,82,"soilhumi1:");
- OLED_display_string_8x16(0,98,"soilhumi2:");
-
- while(1) {
- shidu = Get_Adc_Average(ADC_Channel_1,10);
- s1 = Get_Adc_Average(ADC_Channel_1,10);
- soliHumi = Get_Adc(ADC_Channel_1);
- OLED_modify_num(40,82,soliHumi,16);
- OLED_modify_num(40,98,s1,16);
- //LED0=!LED0;
- delay_ms(100);
- }
- }
復制代碼 |
|