HK32F030MF4P6 用户手册
内部参考电压
adc.c
#include "bsp_adc.h"/*** @brief ADC GPIO 初始化* @param 无* @retval 无*/
static void ADCx_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;// 打开 ADC IO端口时钟ADC_GPIO_AHBxClock_FUN ( ADC_GPIO_CLK, ENABLE );// 配置 ADC IO 引脚模式// 必须为模拟输入GPIO_InitStructure.GPIO_Pin = ADC_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;// 初始化 ADC IOGPIO_Init(ADC_PORT, &GPIO_InitStructure);
}/*** @brief 配置ADC工作模式* @param 无* @retval 无*/
static void ADCx_Mode_Config(void)
{ADC_InitTypeDef ADC_InitStructure; // 打开ADC时钟ADC_APBxClock_FUN ( ADC_CLK, ENABLE );// 使能内部参考电压ADC_VrefintCmd(ADCx,ENABLE);ADC_DeInit(ADC1);/* 注意:这个ADC_InitStructure结构体变量反初始化非常必要,不进行反初始化会导致ADC的配置参数出错。或者另外一个方法是对结构体成员ADC_InitStructure.ADC_ExternalTrigConvEdge进行赋值,不要空着*/ADC_StructInit(&ADC_InitStructure); // ADC模式配置// 连续转换模式ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;// 不用外部触发转换,软件开启即可ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConvEdge_None;// 转换结果数据右对齐方式ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;// ADC转换扫描方式向:从小到大ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;// 初始化ADCADC_Init(ADCx,&ADC_InitStructure);// 配置ADC通道转换时间/* ADC1 regular channels configuration */ ADC_ChannelConfig(ADCx, ADC_CHANNEL , ADC_SampleTime_239_5Cycles);// 对ADC进行校准ADC_GetCalibrationFactor(ADC1);// ADC 转换结束产生中断,在中断服务程序中读取转换值ADC_ITConfig(ADCx, ADC_IT_EOC, ENABLE);/* Enable ADC1 */ADC_Cmd(ADCx, ENABLE);while(!ADC_GetFlagStatus(ADCx, ADC_FLAG_ADRDY)); // 由于没有采用外部触发,所以使用软件触发ADC转换ADC_StartOfConversion(ADCx);
}static void ADC_NVIC_Config(void)
{NVIC_InitTypeDef NVIC_InitStructure;// 配置中断优先级NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQ;NVIC_InitStructure.NVIC_IRQChannelPriority = 2;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}/*** @brief ADC初始化* @param 无* @retval 无*/
void ADCx_Init(void)
{
// ADCx_GPIO_Config();ADCx_Mode_Config();ADC_NVIC_Config();
}// 中断服务函数
void ADC_IRQHandler(void)
{if (ADC_GetITStatus(ADCx,ADC_IT_EOC)==SET) {// 读取ADC的转换值ADC_ConvertedValue = ADC_GetConversionValue(ADCx);}ADC_ClearITPendingBit(ADCx,ADC_IT_EOC);//清除ADCx的中断
}/**************************************************************************
*@brief函数功能:AD中位值滤波法,连续采样N次(N取奇数),把N次采样值按大小排列,取中间值为本次有效值
*@param入口参数:无
*@retval返 回 值:N (采样次数)
**************************************************************************/
uint16_t Fliter_middle(uint8_t N)
{uint16_t value_buf[N];uint16_t count,i,j,temp;for(count = 0;count < N;count++) //获取采样值{value_buf[count] = ADC_ConvertedValue;}for(j = 0;j<(N-1);j++){for(i = 0;i<(N-j-1);i++){if(value_buf[i]>value_buf[i+1]) // 冒泡法排序{temp = value_buf[i];value_buf[i] = value_buf[i+1];value_buf[i+1] = temp;}}}return value_buf[(N-1)/2];
}
main.c
#include "system.h"int main(void)
{softWareDelay(10); //系统上电延时函数systemInit(); // 初始化while(1) {if(Model_Key > 3){ Model_Key = 0;}switch(Model_Key){case 0:Display_FloatData((float)Fliter_middle(11)*3.3/4095);break;case 1:Display_FloatData(ch2);break;case 2:Display_IntData(USART_Temp);break;case 3:Display_IntData(303);break;default:break;}softWareDelay(2500);}}
效果