/******************************************************************************* * [url=home.php?mod=space&uid=288409]@file[/url] KungFu8_ADC.c * [url=home.php?mod=space&uid=187600]@author[/url] ChipON Application Team * [url=home.php?mod=space&uid=895143]@version[/url] V0.0.1 * @date * @brief * * ****************************************************************************** */ #include "KungFu8_ADC.h" /*********************************************************************************** * 函数名 :ADC_Configuration * 函数功能 :ADC模块配置 * 入口参数 :无 * 返回 :无 * ADC模块配置 **********************************************************************************/ void ADC_Configuration(void) { // 对应AD引脚的模式配置,配置为模拟 输入。 需注意:系列芯片设计IO默认为模拟输入脚功能 // ANS0= 0x02 | 0x04 | 0x01 | 0x40 ; // 0x02 | 0x04 | 0x01 | 0x40 VS AN11 AN12 AN13 AN17 VS P01 P02 P00 P17 // TR0|=(0x02 | 0x04 | 0x01 | 0x40 ); // 0x02 | 0x04 | 0x01 | 0x40 VS AN11 AN12 AN13 AN17 VS P01 P02 P00 P17 ANS1=0x00; // NONE ANS2=0x00; // NONE ANS3=0x00; // NONE ANS4=0x00; // NONE ANS5= 0x02 | 0x04 | 0x01 ; // 0x02 | 0x04 | 0x01 | 0x40 VS AN8 AN18 AN19 VS P52 P50 P51 TR5|=(0x02 | 0x04 | 0x01 ); // 0x02 | 0x04 | 0x01 | 0x40 VS AN8 AN18 AN19 VS P52 P50 P51 ANS6=0x20 ; // 0x20 VS AN9 VS P65 TR6|=(0x20); // 0x20 VS AN9 VS P65 ANS7=0x00; ADCCTL0=0x80 | 0x00 | 0x01 ; // bit7 1右对齐 0左对齐,bit6 是否T2中断触发AD采样,bit0 使能AD模块 ADCCTL1=0x80 | ADC_FAD_SCLKDIV4 | ADC_VREF_VDD ; // bit7 是否失调校准使能 // 如果使用内部参考电压,需要配置FVR,参见FVR例程 VREFCTL的配置 ADCCTL2=AN8; // 特别需要说明的时,选通通道后不能立即启动转换,因为需要时间采样,典型时间5us。 } /*********************************************************************************** * 函数名 :ADC_GetConvertData * 函数功能 :AD 结果获取 * 入口参数 :无 仅用户结果的获取,建立在通道并转换完成 * 返回 : * 说明 : 常规使用右对齐的12位,左对齐仅做8位应用时使用,即高位为8位的转换结果。 **********************************************************************************/ unsigned int ADC_GetData(void) { s_uint16 Adbuf; Adbuf.byte1 = ADCDATA0H; Adbuf.byte0 =ADCDATA0L; return Adbuf.value; } /*********************************************************************************** * 函数名 :ADC_GetConvertData * 函数功能 :AD 结果获取 * 入口参数 :通道 如AN8 ,滤波次数 1,16 【接近长度存贮,满量程的16倍滤波加和不溢出】 * 返回 : 16bit的采样结果,如果存在满量程,滤波次数最多16,最大半量程下滤波参数可以到的32 * 说明 : 滤波参数需要匹配加和结果不溢出。如果固定 4次 8次 16次 32次 可另建立函数,固定次数代码编写,效率会存在提升。 * 常规使用右对齐的12位,左对齐仅做8位应用时使用,即高位为8位的转换结果。 **********************************************************************************/ unsigned int ADC_GetConvertData(unsigned char chsel,unsigned char fitercount) { s_uint16 Adbuf; s_uint16 Adsum; unsigned char i; ADCCTL2=chsel; Delay_Wait_CLK_Sample(5); // 切换通道到启动转换需要保留采样时间 Adsum.value=0; for(i=0;i<fitercount;i++) { START=1; // 启动转换 while(START); // 转换完成硬件清零,如果使用ADIF,需要做ADIF的清零 // while(!ADIF);ADIF=0; // Adbuf.value=ADC_GetConvertData(); // 自身的传递占用代码比直接获取效率差,这里直接获取 // Adsum.value+=Adbuf.value; // 值处理 Adbuf.byte1 = ADCDATA0H; Adbuf.byte0 =ADCDATA0L; Adsum.value+=Adbuf.value; } return Adsum.value/fitercount; } /*********************************************************************************** // ****************************************************************************** */
举报
/**************************************************************************************** * * 文件名: main.c * 项目名: * 版 本: v1.0 * 日 期: * 作 者: * ****************************************************************************************/ #include "includes.h" s_uint16 AdVaule; s_uint16 AdResult; /*********************************************************************************** * 函数名 : * 函数功能 :有限周期数的延迟 * 入口参数 :1~255的有效范围 * 返回 :无 *********************************************************************************** */ void Delay_Wait_CLK_Sample(unsigned char x) { #pragma save #pragma disable_warning 59 #pragma disable_warning 85 // 59 85 屏蔽参数未使用警告,函数未返回警告,作用于嵌汇编函数功能实现 __asm ;// 参数使用R0传递 ;//MOV R0,#0x05 固定样例 DECJZ R0 JMP $-1 __endasm; #pragma restore } //*********************************************************************************** //主函数 //*********************************************************************************** void main() { OSCCTL=0x70; // 系统时钟 // FVR 配置 ,使样例可切换到内部电压为参考源,具体查看FVR例程 VREFCTL= 0x80 | 0x30 ; // 电压选择 2/3/4V 0x40 0x80 0xC0 | 校准使能 与校准时钟 0x30 0x00 VREFEN=1; // 使能 ADC_Configuration(); while(1) {// 注:调试时第二次循环指向上一行代码,此为正常现象,是因为嵌汇编的XX指令在KF工具中没有行号,被属于需上一行代码的尾指令。 _CWDT_(); // 周期性清理,如果代码执行时间超过看门狗的周期,应该在代码中插入清狗指令。 START=1; // 启动转换 while(START); // 转换完成硬件清零,如果使用ADIF,需要做ADIF的清零 AdVaule.value=ADC_GetData(); AdResult.value=ADC_GetConvertData(AN8,8); Delay_Wait_CLK_Sample(200); } } //中断函数0:0X04入口地址 void int_fun0() __interrupt (0) { } //中断函数1:0x14入口地址 void int_fun1() __interrupt (1) { }
本版积分规则 发表回复 回帖后跳转到最后一页
72
520
3
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号