模擬看門狗如何實(shí)現(xiàn)?
啥是看門狗?
上面大致介紹了常見的獨(dú)立看門狗的功能及工作流程。那么STM32芯片的模擬看門狗是又怎么回事呢?跟上面提到的獨(dú)立看門狗有關(guān)系嗎?它是怎么工作的?
模擬看門狗
如果說沒有這個(gè)模擬看門狗,而我們又需要對(duì)模擬輸入信號(hào)幅度做實(shí)時(shí)監(jiān)測(cè),往往會(huì)有兩方面的方案。其一,我們通過軟件方式,對(duì)ADC采樣值進(jìn)行代碼輪詢。顯然,這會(huì)大大增加CPU的負(fù)荷,而且實(shí)時(shí)性也難以保證。其二,我們可以考慮額外設(shè)計(jì)硬件監(jiān)控電路。比方,將模擬輸入外接兩個(gè)比較器,將模擬信號(hào)與外部產(chǎn)生的上下邊界比較閾值進(jìn)行比較(如下圖),從而產(chǎn)生中斷信號(hào)給單片機(jī)也能實(shí)現(xiàn)類似的實(shí)時(shí)功能需求。
模擬看門狗在哪里?
有啥工程應(yīng)用價(jià)值?
供電電源超界檢測(cè)。在產(chǎn)品開發(fā)中,常常需要實(shí)現(xiàn)較為智能的電源診斷。在一個(gè)產(chǎn)品的關(guān)鍵功能鏈中,電源是否異常往往需要格外關(guān)注。通常需要相應(yīng)的診斷檢測(cè)電路,以檢測(cè)設(shè)備電源電壓是否超出限定值,如超出限定值需做出診斷報(bào)警。這在工業(yè)產(chǎn)品、汽車電子、醫(yī)療器械中都有明確強(qiáng)制要求。
實(shí)現(xiàn)控制環(huán)路fail-safe模式。比如一個(gè)控制系統(tǒng)根據(jù)采集到的傳感器信號(hào)來控制閥門的開度,以實(shí)現(xiàn)流量控制?;蛘咭粋€(gè)速度控制系統(tǒng),如果傳感器信號(hào)異常,需要馬上將設(shè)備置于功能安全狀態(tài),以避免造成經(jīng)濟(jì)損失或者帶來人身傷害。還比如一個(gè)電機(jī)轉(zhuǎn)速控制系統(tǒng),如果電流傳感器值超限,需要馬上讓電機(jī)停機(jī)等。
其實(shí),需要做模擬監(jiān)測(cè)的場(chǎng)合還很多,這里不多做列舉。
代碼怎么寫呢?
static void ADC_Config(void){ ADC_ChannelConfTypeDef sConfig; ADC_AnalogWDGConfTypeDef AnalogWDGConfig;??/*?初始化?*/?AdcHandle.Instance = ADCx;??AdcHandle.Init.ClockPrescaler????????=?ADC_CLOCK_ASYNC_DIV1;??????????/*?異步時(shí)鐘模式,時(shí)鐘不分頻?*/?AdcHandle.Init.Resolution = ADC_RESOLUTION_12B; /* 12位 */AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* 右對(duì)齊模式 */AdcHandle.Init.ScanConvMode = DISABLE; /* Sequencerdisabled (ADC conversion on only 1 channel: channel set on rank 1) */AdcHandle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; /* EOC標(biāo)志指示轉(zhuǎn)換結(jié)束 */AdcHandle.Init.LowPowerAutoWait = DISABLE; /* 自動(dòng)延遲轉(zhuǎn)換功能禁用 */AdcHandle.Init.ContinuousConvMode = DISABLE; /* 禁用連續(xù)模式,單次模式 */AdcHandle.Init.NbrOfConversion = 1;AdcHandle.Init.DiscontinuousConvMode = DISABLE;AdcHandle.Init.NbrOfDiscConversion = 1;AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T3_TRGO; /* Timer 3 觸發(fā) */AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING; /* 軟件觸發(fā) */AdcHandle.Init.DMAContinuousRequests = ENABLE; /* DMA 循環(huán)模式使能 */AdcHandle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; /* 如溢出DR寄存器將被最后的轉(zhuǎn)換結(jié)果覆蓋 */AdcHandle.Init.OversamplingMode = DISABLE; /* 禁用過采樣 */if (HAL_ADC_Init(&AdcHandle) != HAL_OK){/* 初始化錯(cuò)誤處理 */Error_Handler();??}?/* 如ADC轉(zhuǎn)換超出所設(shè)模擬看門狗窗口,則考慮到IT在每次ADC轉(zhuǎn)換后發(fā)生,*//* 請(qǐng)選擇足夠長(zhǎng)的采樣時(shí)間和ADC時(shí)鐘,以免在IRQHandler中產(chǎn)生開銷。*/sConfig.Channel = ADC_CHANNEL_5; /* 通道選擇 */sConfig.Rank = ADC_REGULAR_RANK_1; /* Rank 選擇 */sConfig.SamplingTime = ADC_SAMPLETIME_6CYCLES_5; /* 采樣時(shí)間 */sConfig.SingleDiff = ADC_SINGLE_ENDED; /* 單端輸入模式 */sConfig.OffsetNumber = ADC_OFFSET_NONE; /* 無偏移 */sConfig.Offset = 0; /* 偏移禁用,該值無用 */if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK){/* 通道配置錯(cuò)誤處理 */Error_Handler();}??/*?設(shè)置模擬看門狗閾值?*/????/*?Analog?watchdog?1?模擬看門狗配置?*/?AnalogWDGConfig.WatchdogNumber = ADC_ANALOGWATCHDOG_1;AnalogWDGConfig.WatchdogMode = ADC_ANALOGWATCHDOG_ALL_REG;AnalogWDGConfig.Channel = ADCx_CHANNELa;AnalogWDGConfig.ITMode = ENABLE;AnalogWDGConfig.HighThreshold = (RANGE_12BITS * 5/8);AnalogWDGConfig.LowThreshold = (RANGE_12BITS * 1/8);if (HAL_ADC_AnalogWDGConfig(&AdcHandle, &AnalogWDGConfig) != HAL_OK){/* 配置錯(cuò)誤處理 */Error_Handler();}}?void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef* hadc){/* 看門狗錯(cuò)誤處理,這里可以實(shí)現(xiàn)fail-safe需求*//* 1.比如關(guān)閉關(guān)鍵電路 *//* 2.設(shè)置報(bào)警標(biāo)志 *//* 3.代碼盡可能運(yùn)行短 */.....ubAnalogWatchdogStatus = SET;}?#define ADCCONVERTEDVALUES_BUFFER_SIZE 256 /* 數(shù)組aADCxConvertedValues[]大小 *//* ADC轉(zhuǎn)換結(jié)果 */static __IO uint16_t aADCxConvertedValues[ADCCONVERTEDVALUES_BUFFER_SIZE];static void start_adc(void){/* 啟動(dòng)ADC以DMA模式運(yùn)行 */if (HAL_ADC_Start_DMA(&AdcHandle,(uint32_t *)aADCxConvertedValues,ADCCONVERTEDVALUES_BUFFER_SIZE) != HAL_OK){/* 啟動(dòng)錯(cuò)誤處理 */Error_Handler();}}?
總結(jié)
長(zhǎng)按前往圖中包含的公眾號(hào)關(guān)注
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!





