完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#include "SocAdc.h"
/*---------------------------- Software delay function ----------------------------*/ void Delay(uint16 n) { uint16 x; while (n--) { x = 5000; while (x--){;} } } /*---------------------------- Get ADC result ----------------------------*/ uint16 GetAdcResult(uint8 ch) { uint16 tmp = 0; //无符号16位整型变量 ADC_CONTR = ADC_POWER | ADC_SPEEDHH | ch | ADC_START; _nop_(); //Must wait before inquiry _nop_(); _nop_(); _nop_(); while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag //ADC_CONTR &= ~ADC_FLAG; //Close ADC tmp = ADC_RES; //A/D 转换结果高8位 ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2 0000,0000 tmp <<= 2; //等价于 tmp = tmp<< 2 ,左移2位 tmp |= ADC_RESL; //等价于tmp= ADC_RESL | tmp 按位或, A/D 转换结果低2位 ADCV.1 ADCV.0 0000,0000 return tmp; //Return ADC result ,即输出一个采样点的二进制表示值 } /**************************************************************** 函数名:AdcInit 参 数: 返回值: 描 述:ADC初始化 ****************************************************************/ void AdcInit() { P1M1 = 0x0f; P1M0 = 0x00; P1ASF = 0x0f; //Open 8 channels ADC function AUXR1 &= (~0x04); ADC_RES = 0; //Clear previous result ADC_RESL = 0; ADC_CONTR = ADC_POWER | ADC_SPEEDHH; Delay(2); //ADC power-on and delay } /**************************************************************** 函数名:GetAdc10bit 参 数:ucChannel = 通道(0~7) 返回值: 描 述:10位采样 ****************************************************************/ uint16 GetAdc10bit(uint8 ucChannel) { if (ucChannel > 7) {return 0;} GetAdcResult(ucChannel); //切换后的第1次舍去 return GetAdcResult(ucChannel); } /**************************************************************** 函数名:GetAdc12bit 参 数:ucChannel = 通道(0~7) 返回值: 描 述:12位采样 ****************************************************************/ uint16 GetAdc12bit(uint8 ucChannel) { uint16 sum = 0; uint8 i = 0; if (ucChannel > 7) {return 0;} GetAdcResult(ucChannel); //切换后的第1次舍去 for (i=0; i<4; i++) //2^2 //10bit过采样到12bit(0~4095) { sum += GetAdcResult(ucChannel); } return (uint16)sum; } /**************************************************************** 函数名:GetAdc14bit 参 数:ucChannel = 通道(0~7) 返回值: 描 述:14位采样 ****************************************************************/ uint16 GetAdc14bit(uint8 ucChannel) { uint16 sum = 0; uint8 i = 0; if (ucChannel > 7) {return 0;} GetAdcResult(ucChannel); //切换后的第1次舍去 for (i=0; i<16; i++) //2^4 //10bit过采样到14bit(0~16383) { sum += GetAdcResult(ucChannel); } return (uint16)sum; } /**************************************************************** 函数名:GetAdc16bit 参 数:ucChannel = 通道(0~7) 返回值: 描 述:16位采样 ****************************************************************/ uint16 GetAdc16bit(uint8 ucChannel) { uint16 sum = 0; uint8 i = 0; if (ucChannel > 7) {return 0;} GetAdcResult(ucChannel); //切换后的第1次舍去 for (i=0; i<64; i++) //2^6 //10bit过采样到16bit(0~65535) { sum += GetAdcResult(ucChannel); } return (uint16)sum; } |
|
相关推荐
3个回答
|
|
学习下,新人重新开始
|
|
|
|
采样位数不变 只是把寄存器的前8位取出来专换成采样直而已
|
|
|
|
能说具体点吗?本身是10位AD采样,12位采样是采集4个数据进行累加,14位采样是采集16个数据进行累加,这是为什么? |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2272 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
2083 浏览 3 评论
4708 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2229 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2773 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 00:37 , Processed in 0.611461 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号