天津做網(wǎng)站的公司營銷網(wǎng)絡(luò)推廣哪家好
如果被ADC轉(zhuǎn)換的模擬電壓低于低閥值或高于高閥值,AWD模擬看門狗狀態(tài)位被設(shè)置。閥值位 于ADC_HTR和ADC_LTR寄存器的最低12個有效位中。通過設(shè)置ADC_CR1寄存器的AWDIE位 以允許產(chǎn)生相應(yīng)中斷。通過以下函數(shù)可以進(jìn)行配置
- void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog);
- void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold);
- void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel);
?
根據(jù)框圖修改ADC一節(jié)的代碼。添加看門狗功能代碼和NVIC中斷代碼
?
#include "stm32f10x.h" // Device headervoid AD_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_Init_Structure;//配置為模擬輸入模式.在AIN模式下,GPIO是無效的,防止GPIO的輸入輸出對模擬電壓的影響GPIO_Init_Structure.GPIO_Mode=GPIO_Mode_AIN;GPIO_Init_Structure.GPIO_Pin=GPIO_Pin_0;GPIO_Init_Structure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_Init_Structure);GPIO_Init_Structure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init_Structure.GPIO_Pin=GPIO_Pin_1;GPIO_Init_Structure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_Init_Structure);RCC_ADCCLKConfig(RCC_PCLK2_Div6); //12MHZADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5); //55.5+12.5=68ADC_InitTypeDef ADC_InitStruct;ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;ADC_InitStruct.ADC_ScanConvMode=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_Init(ADC1,&ADC_InitStruct);//模擬看門狗ADC_AnalogWatchdogSingleChannelConfig(ADC1,ADC_Channel_0); //配置通道ADC_AnalogWatchdogThresholdsConfig(ADC1,3000,0); //閾值A(chǔ)DC_AnalogWatchdogCmd(ADC1,ADC_AnalogWatchdog_SingleRegEnable);//一定不要忘了使能看門狗中斷ADC_ITConfig(ADC1,ADC_IT_AWD,ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel=ADC1_2_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStruct);//使能ADC_Cmd(ADC1,ENABLE);//復(fù)位校準(zhǔn)ADC_ResetCalibration(ADC1); //ADCx->CR2 |= CR2_RSTCAL_Set;while(ADC_GetResetCalibrationStatus(ADC1) == SET); //該位由軟件設(shè)置并由硬件清除。在校準(zhǔn)寄存器被初始化后該位將被清除ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1) == SET);}uint16_t AD_GetValue(void)
{//軟件觸發(fā)轉(zhuǎn)換ADC_SoftwareStartConvCmd(ADC1,ENABLE);//不能用這個函數(shù):由軟件設(shè)置該位以啟動轉(zhuǎn)換,轉(zhuǎn)換開始后硬件馬上清除此位。//ADC_GetSoftwareStartConvStatus()//該位由硬件在(規(guī)則或注入)通道組轉(zhuǎn)換結(jié)束時設(shè)置,由軟件清除或由讀取ADC_DR時清除。0:轉(zhuǎn)換未完成;1:轉(zhuǎn)換完成。while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) ==RESET);return ADC_GetConversionValue(ADC1);
}
使用光敏電阻模塊,當(dāng)模擬數(shù)值超過閾值,進(jìn)入中斷,即光線弱時led燈點(diǎn)亮。
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LED.H"
#include "Key.h"
#include "OLED.H"
#include "AD.H"uint16_t light,temp;
uint8_t flag=0;int main(void)
{OLED_Init();AD_Init();GPIO_SetBits(GPIOA,GPIO_Pin_1);while(1){light = AD_GetValue();OLED_ShowNum(1,1,light,4);if(flag==1){GPIO_ResetBits(GPIOA,GPIO_Pin_1);flag=0;}else{GPIO_SetBits(GPIOA,GPIO_Pin_1);}}
}void ADC1_2_IRQHandler(void)
{if(ADC_GetITStatus(ADC1,ADC_IT_AWD) == SET){flag=1;ADC_ClearITPendingBit(ADC1,ADC_IT_AWD);}
}