摘要:傳感器內部是一個紅外線對管,當光線穿過一定量的水時,光線的透過量取決于該水的污濁程度,水越污濁,透過的光就越少。根據上面的原理可知,了解到只要獲取到電壓就可以獲取水濁度,所以采取模擬數字轉換來實現獲取到水濁度。
?
? ??根據上面的原理可知,了解到 只要獲取到電壓就可以獲取水濁度,所以采取 ADC 模擬/數字轉換來實現獲取到水濁度。
??
?(1)首先先定義 TSW30(水濁度傳感器)上所對應的 LED 引腳,方便后續校驗
GPIO_InitTypeDef GPIO_InitStrue; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); GPIO_InitStrue.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStrue.GPIO_Pin = GPIO_Pin_13; GPIO_InitStrue.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC,&GPIO_InitStrue);
?(2)再定義 STM32 上對應的 模擬 引腳和 ADC 引腳,這個需要根據下面的圖來進行定義
?
?
?博主這邊采取的是 通道1 PA1 口 的 ADC1
?大概實現步驟為:
- 開啟 PA 口時鐘和 ADC1 時鐘,設置 PA1 為模擬輸入- 復位 ADC1, 同時設置 ADC1 分頻因子- 初始化 ADC1 參數- 使能 ADC 并校準
?所以可得出的代碼為:
GPIO_InitTypeDef GPIO_InitStruct; ADC_InitTypeDef ADC_InitStruct; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE); RCC_ADCCLKConfig(RCC_PCLK2_Div4); GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init( GPIOA, &GPIO_InitStruct); ADC_DeInit(ADC1); 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 ADC_ResetCalibration( ADC1); //使能復位校準 while(ADC_GetResetCalibrationStatus(ADC1)); //等待復位校準結束 ADC_StartCalibration( ADC1); while(ADC_GetCalibrationStatus(ADC1));
? ?注意: 需要額外注意的是 RCC_ADCCLKConfig(RCC_PCLK2_Div4); //需要對 ADC時鐘進行分頻
?
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_1Cycles5);參數1: ADCx 選擇 ADC 外設參數2: 設置 ADC 通道 (更多參閱 STM32 庫函數 中的 ADC_Channel)參數3: 規則組采樣順序 --這里我們只使用一種,所以直接定義為 Rank = 1 即可參數四: 指定 ADC 通道的采樣時間值
?
ADC_SoftwareStartConvCmd( ADC1, ENABLE);
?
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)); //判斷是否轉換結束 return ADC_GetConversionValue(ADC1); //返回最近一次 ADC 采取的數值**再寫個函數 取平均值,大概每 10 次取平均值即可**
? ?
? ?根據商家提供的計算公式或例程可以計算出 所對應的 水濁度信息 (獲取電流)
adcx=Get_Adc_Average(ADC_Channel_1,10); //獲取到 電壓平均值 temp=(float)adcx*(3.3/4096); temp = temp*100/3.3; if(temp > 100) temp = 100;
?
(1)初始化串口
GPIO_InitTypeDef GPIO_InitStrue; USART_InitTypeDef USART_InitStrue; NVIC_InitTypeDef NVIC_InitStrue; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //使能 USART1 GPIO_InitStrue.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出 //USART1_Tx USB Rx STM32中為 Tx,需要接到 USB轉TTL串口中的 Rx GPIO_InitStrue.GPIO_Pin = GPIO_Pin_9; GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA,&GPIO_InitStrue); //USART1_Rx USB Tx GPIO_InitStrue.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入 GPIO_InitStrue.GPIO_Pin = GPIO_Pin_10; GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA,&GPIO_InitStrue); USART_InitStrue.USART_BaudRate = 115200; USART_InitStrue.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStrue.USART_Mode = USART_Mode_Tx|USART_Mode_Rx; USART_InitStrue.USART_Parity = USART_Parity_No; USART_InitStrue.USART_StopBits = USART_StopBits_1; USART_InitStrue.USART_WordLength = USART_WordLength_8b; USART_Init(USART1,&USART_InitStrue); USART_Cmd(USART1,ENABLE); USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); NVIC_InitStrue.NVIC_IRQChannel = USART1_IRQn;//設置中斷 NVIC_InitStrue.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 1; //搶占優先級1 NVIC_InitStrue.NVIC_IRQChannelSubPriority = 1; //子優先級1 NVIC_Init(&NVIC_InitStrue);
?
(2)中斷發送數據
void USART1_IRQHandler(void) { u8 s; while(*s!="/0") { while(USART_GetFlagStatus(USART1,USART_FLAG_TC )==RESET); USART_SendData(USART1,*s); s++; }}
?
? ?第一次嘗試編寫博客,若是有什么建議,歡迎批評指出。
? ?后續會逐步分塊更新,并會在最后一篇文章上傳源代碼。
? ?若是該文章對你有作用或是覺得文章寫得還行,幫忙點點贊,三連!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/121369.html
摘要:為了解決人們因工作出差旅游等短期時間內家中寵物無人照顧的問題,我們基于物聯網開發板機智云平臺和各類傳感器模塊研究設計了一套針對短期內寵物無人照顧的智能寵物屋系統。 正式介紹作品前先說明一下,我是湖南文理學院計算機與電氣工程學院的一名大三學生,我叫陳海濤。作品全部內容均為個人創意、個人設計并手...
摘要:全球最大的開源基金會軟件基金會的董事甚至認為,云原生邊緣計算意味著嵌入式計算的終結。這次我們不妨更加透徹的談談,云原生邊緣計算和嵌入式計算,將如何融合相互借勢。云原生應用,即指專門為在云平臺部署和運行而設計的應用。這是我在【物女心經】專欄寫的第105篇文章。嵌入式計算已經笑傲江湖多年,然而,最近它的地位似乎正在受到某種撼動。全球最大的開源基金會——Apache軟件基金會的董事Roman Sh...
摘要:對于采取邊緣計算的企業來說,制定全面戰略的五個主要組成部分如下確定目標和要求,包括業務目標驅動因素以及品牌,客戶和投資回報要求。 像大多數新的IT技術發展一樣,邊緣計算并不是一場革命,相反,它更像是一個進化。邊緣計算的根源在于早期的內容交付和點對點網絡以及網格計算。然而,隨著網絡,計算和分析技術能力的提高以及...
摘要:對于采取邊緣計算的企業來說,制定全面戰略的五個主要組成部分如下確定目標和要求,包括業務目標驅動因素以及品牌,客戶和投資回報要求。 像大多數新的IT技術發展一樣,邊緣計算并不是一場革命,相反,它更像是一個進化。邊緣計算的根源在于早期的內容交付和點對點網絡以及網格計算。然而,隨著網絡,計算和分析技術能力的提高以及大規模數據增長的需求,意味著計算對于IT管理人員而言將變得越來越重要。?隨著大量數據...
閱讀 1891·2021-11-22 09:34
閱讀 3025·2021-09-28 09:35
閱讀 13430·2021-09-09 11:34
閱讀 3599·2019-08-29 16:25
閱讀 2825·2019-08-29 15:23
閱讀 2041·2019-08-28 17:55
閱讀 2431·2019-08-26 17:04
閱讀 3048·2019-08-26 12:21