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 IO
GPIO_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;
// 初始化ADC
ADC_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);
}
}
效果