我的ADC能正常读取到,使用的是unsigned int ,我的参考电压是2.5V读取出来的ADC数值*2500会超限,使用unsigned long数据就会变成0,求教怎么进行数据计算,unsigned int V,adc 使用V= (adc*2500/4096);无法实现计算
- #include "drive_ADC.h"
-
- #define BUBBLE_SORT //设置使用冒泡排序,去掉最高值、最低值,求中间平均值(不需要的话屏蔽此行)
- #define SUM_LENGTH 16 /* 平均值采样次数 最大值16(不需要的话可将定义值改为 1 )*/
- #ifdef BUBBLE_SORT //使用冒泡排序,去掉最高值、最低值,求中间平均值
-
- int voladc1,voladc2,voladc3,voladc4;
- u16 ADC_Buffer[16];
- #endif
- //void ADC_Isr() interrupt 5
- //{
- // ADC_CONTR &= ~0x20; //清中断标志
- // voladc1=(ADC_RES << 8) | ADC_RESL;//adc读取
- // ADC_CONTR |= 0x4a; //继续 AD 转换
- //}
-
- //符号 地址 adc电源 启动转换 转换结束 PWM触发 通道选择
- //ADC_CONTR BCH ADC_POWER ADC_START ADC_FLAG ADC_EPWMT ADC_CHS
- // 1 1 1 1 0000
- void initADC(void)
- {
- P_SW2 |= 0x80; //使能访问 XFR,没有冲突不用关闭
- ADCTIM = 0x3f; //设置 ADC 内部时序
- ADCCFG = 0x20; //设置 ADC 时钟为系统时钟/2/1
- //ADCCFG = 0x2f; //设置 ADC 时钟为系统时钟/2/16
- ADC_CONTR = 0x80; //使能 ADC 模块
- //EADC = 1; //使能 ADC 中断
- EA = 1;
- //ADC_CONTR |= 0x40; //启动 AD 转换
- }
-
- #ifdef BUBBLE_SORT //使用冒泡排序
- //========================================================================
- // 函数: void DataSwap(u16* data1, u16* data2)
- // 描述: 数据交换函数。
- // 参数: data1,data2 要交换的数据.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2021-9-27
- // 备注:
- //========================================================================
- void DataSwap(u16* data1, u16* data2)
- {
- u16 temp;
- temp = *data1;
- *data1 = *data2;
- *data2 = temp;
- }
-
- //========================================================================
- // 函数: void BubbleSort(u16* pDataArry, u8 DataNum)
- // 描述: 冒泡排序函数。
- // 参数: pDataArry需要排序的数组,DataNum需要排序的数据个数.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2021-9-27
- // 备注:
- //========================================================================
- void BubbleSort(u16* pDataArry, u8 DataNum)
- {
- bit flag;
- u8 i,j;
- for(i=0;i<DataNum-1;i++)
- {
- flag = 0;
- for(j=0;j<DataNum-i-1;j++)
- {
- if(pDataArry[j] > pDataArry[j+1])
- {
- flag = 1;
- DataSwap(&pDataArry[j], &pDataArry[j+1]);
- }
- }
- if(!flag) //上一轮比较中不存在数据交换,则退出排序
- {
- break;
- }
- }
- }
- #endif
-
- //========================================================================
- // 函数: u16 Get_ADC12bitResult(u8 channel)) //channel = 0~15
- // 描述: 查询法读一次ADC结果.
- // 参数: channel: 选择要转换的ADC, 0~15.
- // 返回: 12位ADC结果.
- // 版本: V1.0, 2016-4-28
- //========================================================================
- u16 Get_ADC12bitResult(u8 channel) //channel = 0~15
- {
- ADC_RES = 0;
- ADC_RESL = 0;
-
- ADC_CONTR = (ADC_CONTR & 0xF0) | 0x40 | channel; //启动 AD 转换
- _nop_();
- _nop_();
- _nop_();
- while((ADC_CONTR & 0x20) == 0); //等待ADC结束
- ADC_CONTR &= ~0x20; //清除ADC结束标志
- return (((u16)ADC_RES << 8) | ADC_RESL);
- }
-
- /***********************************
- 查询方式做一次ADC, chn为通道号, chn=0~7对应P1.0~P1.7, chn=8~14对应P0.0~P0.6, chn=15对应BandGap电压.
- ***********************************/
- u32 ADC_convert(u8 chn)
- {
- u16 j ;
- //u32 h;
- u8 k; //平均值滤波时使用
-
- Get_ADC12bitResult(chn); //参数i=0~15,查询方式做一次ADC, 切换通道后第一次转换结果丢弃. 避免采样电容的残存电压影响.
- Get_ADC12bitResult(chn); //参数i=0~15,查询方式做一次ADC, 切换通道后第二次转换结果丢弃. 避免采样电容的残存电压影响.
-
- #ifdef BUBBLE_SORT //使用冒泡排序,去掉最高值、最低值,求中间平均值
-
- for(k=0; k<16; k++) ADC_Buffer[k] = Get_ADC12bitResult(chn);
- BubbleSort(ADC_Buffer,16); //冒泡排序
- for(k=4, j=0; k<12; k++) j += ADC_Buffer[k]; //取中间8个数据
- j = j / 8; // 求平均
-
- #else //采样累加,求平均值(不需要的话可将 SUM_LENGTH 定义值改为 1 )
-
- for(k=0, j=0; k<SUM_LENGTH; k++) j += Get_ADC12bitResult(chn); // 采样累加和 参数0~15,查询方式做一次ADC, 返回值就是结果
- j = j / SUM_LENGTH; // 求平均
-
- #endif
- h= (j*2500/4096);
-
- //debug("ADCV%02bd=%04u",chn,g);
- debug("ADC%02bd=%u",chn,h);
- return j;
- }
复制代码
|