ADC通道检测功能-单片机通用模板

ADC通道检测功能-单片机通用模板

使用ADC外设的流程:

  1. 先初始化ADC外设的时钟
  2. 选择ADC的参考电压 以及需要采集的通道
  3. ADSOC=1 开始转换,死循环等待转换完成ADSOC=0;
  4. 从ADCDH、ADCDL数据寄存器 取出ADC转换数值
  5. 进行中位值平均滤波限幅平均滤波限幅消抖滤波滑动平均滤波加权递推平均滤波一阶互补滤波等滤波处理。
c 复制代码
//=============================================================================
//函数名称:ADCInit
//输	入:无
//输	出:无
//功	能:系统ADC外设初始化
//=============================================================================
void ADCInit(void)
{
	OPTION = (OPTION&ADCKS_Mask)|ADCKS_sys_4;	//ADC 时钟频率选择FSys/32
}

//=============================================================================
//函数名称:getChannelVal
//输	入:channel 通道
//输	出:无
//功	能:中位值平均滤波获取channel通道ADC值
//=============================================================================
u16 getChannelVal(u8 channel)
{
	u8 i=0;
	u16 adcValMin=0xffff,adcValMax=0;
	u16 adcValue=0,adcValueSum=0;
	ADCHS = (ADCHS & ~ADCHS_MASK)|channel;
	SET_ADVREFS_00;
	for(i=0;i<4;i++)
	{
		ADSOC = 1;
		while(ADSOC);
		adcValue = (ADCDH<<4)|(ADCDL>>4);
		adcValueSum += adcValue;
		if(adcValMin>adcValue)
			adcValMin=adcValue;
		if(adcValMax<adcValue)
			adcValMax=adcValue;
	}
	return	(adcValueSum-adcValMin-adcValMax)/2;
	//return	(adcValueSum-adcValMin-adcValMax)>>2;		//移位
}

//=============================================================================
//函数名称:setAdv_getChannelVal
//输	入:adv 参考电压 channel 通道
//输	出:adcValue 12bit的Adc数据
//功	能:设置参考电压ADV和通道channel获取ADC
//=============================================================================
u16 setAdv_getChannelVal(ADV adv,u8 channel)
{
	u16 adcValue=0;
	ADCHS = channel;
	switch(adv)
	{
		case ADV_VCC:
			SET_ADVREFS_00;
			break;
		case ADV_25:
			SET_ADVREFS_01;
			break;
		case ADV_4:
			SET_ADVREFS_02;
			break;
		case ADV_5:
			SET_ADVREFS_03;
			break;
	}
	
	ADSOC = 1;
	while(ADSOC);
	adcValue = (ADCDH<<4)|(ADCDL>>4);
	return	adcValue;
}

//=============================================================================
//函数名称:Lim_filter
//输	入:new_Adcdata 最新采集ADC limmit 限幅范围
//输	出:无
//功	能:限幅滤波,超出限定范围内波动取上一次的值
//=============================================================================
/*u16 Lim_filter(u16 new_Adcdata,u16 limmit)
{
	static u16 old_Adcdata;
	int deta;
	deta = (int)(new_Adcdata- old_Adcdata);
	if(deta < limmit && deta >-limmit)
	{
		old_Adcdata= new_Adcdata;
		return new_Adcdata;
	}
	else
	{
		old_Adcdata= new_Adcdata;
		return old_Adcdata;
	}
}
*/

//=============================================================================
//函数名称:Lim_filter
//输	入:new_Adcdata 最新采集ADC limmit 限幅范围 aveCnt 平均的总数
//输	出:无
//功	能:限幅平均滤波,限定范围内波动取最新值,达到aveCnt 后取平均
//=============================================================================
/*u16 Lim_ave_filter(u16 new_Adcdata,u16 limmit,u8 aveCnt)
{
 static u16 old_Adcdata=0,filterCnt=0;
 u16 new_value,adcValueSum =0;
 int deta=0;
 deta = (int)(new_Adcdata- old_Adcdata);
 if(deta < limmit && deta >-limmit)
  filter_v[filterCnt++]=new_value;
 if(filterCnt==aveCnt) filterCnt=0;
 for(count =0 ;count<aveCnt;count++)
  adcValueSum +=filter_v[count];
 return (adcValueSum /aveCnt);
*/
//=============================================================================
//函数名称:sort
//输	入:buf 数据 len 数据长度
//输	出:无
//功	能:排序  小到大(冒泡排序)
//=============================================================================
/*static void sort(u16 *buf, u8 len)
{
	u8 i,j;
	u16 temp;

	for (j = 0; j < len - 1; j++) //排序  小到大
	{
		for (i = j + 1; i < len; i++)
		{
			if (buf[j] > buf[i])
			{
				temp = buf[i];
				buf[i] = buf[j];
				buf[j] = temp;
			}
		}
	}
}
*/
//=============================================================================
//函数名称:Glide_ave_filter
//输	入:new_Adcdata 最新采集ADC aveCnt 平均的总数
//输	出:无
//功	能:滑动平均滤波,更新最新的值取平均
//=============================================================================
/*u16 Glide_ave_filter(u16 new_Adcdata, u8 aveCnt)
{
	u8 i;
	u16 adcValueSum = 0;
	u16 temp_buf[ADC_FILTER_CNT];
	
		for(i = 0; i < ADC_FILTER_CNT - 1; i++)  //去掉最旧
		{
			filter_v[i] = filter_v[i + 1];
		}
		filter_v[ADC_FILTER_CNT - 1] = new_Adcdata;  //最新值
		memcpy(temp_buf, filter_v, ADC_FILTER_CNT);
		
	sort(temp_buf, ADC_FILTER_CNT);  //排序  小到大


	for(i = aveCnt; i < ADC_FILTER_CNT - aveCnt; i++)
	{
		adcValueSum += temp_buf[i];
	}

	return (u16)(adcValueSum / (ADC_FILTER_CNT - aveCnt * 2));
}
*/
相关推荐
新思维软件8 分钟前
基于边缘计算与多模态感知的服药依从性系统|X604261
嵌入式硬件·物联网开发
朝发如雪9 小时前
快速掌握单片机基础(3)(PWM)(通信协议基础)(串口通信时序与参数)(电气特性与电平标准)(51单片机UART寄存器配置)(串口应用层协议)
单片机
天空'之城11 小时前
单片机基础核心知识点汇总(四十)
单片机·嵌入式硬件
smartpi_ai11 小时前
离线语音模块误识别问题全面解决方案:命令词设计、防误触与灵敏度调优指南
人工智能·单片机·语音识别
LCG元11 小时前
STM32F103 驱动 HX711 称重实战:DOUT 就绪时序、增益切换陷阱与两点标定精度实测
stm32·单片机·嵌入式硬件
小李不想当小白13 小时前
DMA直接存储器存取(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·分享
朝发如雪14 小时前
快速掌握单片机基础(6)(数据处理与传送指令)(跳转与分支指令)(栈操作与混合编程)(程序状态寄存器操作指令)(内存映射)
单片机·arm
blue_ice .14 小时前
Verilog DDS 数字信号发生器:DAC 输出模拟波形与 ADC 回采观测
开发语言·单片机·嵌入式硬件·fpga开发
深圳市恒锐丰科技杨生14 小时前
EG4318 / EG4319 / EG4320 铅酸电池三段式充电副边管理芯片|屹晶 EGmicro
嵌入式硬件·硬件工程
深圳市恒锐丰科技杨生14 小时前
EG1253 电流模式 PWM 控制器|屹晶 EGmicro
嵌入式硬件·硬件工程