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