当前位置:首页 > 单片机 > 单片机
[导读]在做有AD模块项目的时候遇到几个问题:1, ADC配合DMA采样规则是怎样的。2, ADC在DMA采可否不连续采样,以提高有效采样使用率和降低功耗。3, 如何提高有效利用率和降低功耗,并减少CPU的占用时间。4, ADC的如何多

在做有AD模块项目的时候遇到几个问题:

1, ADC配合DMA采样规则是怎样的。

2, ADC在DMA采可否不连续采样,以提高有效采样使用率和降低功耗。

3, 如何提高有效利用率和降低功耗,并减少CPU的占用时间。

4, ADC的如何多通道采样。

针对以上几个问题做解答。

ADC的采样模式主要分两个:规则采样和注入采样。规则模式可采样16个通道,注入模式最多只能4个通道。

配合DMA使用时主要是用规则采样模式。在初始化时配置采样端口为规则采样通道即可如下:

列:DC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);

端口1为规则采样的第一位,239.5的ADC时钟采样周期。


ADC在DMA下可以不连续采样,既采样一定数据后,关闭ADC及DMA通道。但是这样子存在一些问题。DMA的存储的变量数组中的数据会出现错位问题。

测试过很多方法,包括ADC和DMA一起重新初始化,依然无法解决这个问题。系统只进行一次初始化时,DMA数据无错位现象。 但是对于长时间不关机的产品来说,缺少了几分可靠性。网上也有相关的评测,ADC用DMA工作在强电磁的环境中可能会输出丢失部分数据的可能。



这里就想到了用中断的方式,进行采样。无法用规则模式,因为只能用单次采样触发中断。由于无法确定第一个通道,这样同样会遇到数据错位的现象。所以这里使用注入模式进行中断出发。

有以下几个优点:

1,可以最多4路为一组采样,每组采样结束后才产生一次中断,减少了进中断的次数。

2,在读取数据时几路通道都是预先配置好的。某个变量存放指定某个指定通道。这样永远不可能出现错位现象。

由以总结 在4路及以下通道进行采样时,首选注入模式进行中断采样。超过4路及不是长时间工作的产品(几天以上不断电)可以考虑。

单路采样时,这两种方法都很可靠。


最近刚好在学习uCosII系统,并参考了下通用驱动程序开发。附上ADC驱动代码,希望有所帮助。


提示,在使用某路通道 只要 该通道宏定义置1就可以了。


#defineADCx_CHANNEL0_EN1//ADCx通道11:便能,0:失能


注意: 在使用注入模式时 最多使能4个通道。


1 /*

2 ********************************************************************************

3 * uC/OS-II

4 * AD采样驱动程序设计

5 * ARM Cortex-M3 Port

6 *

7 * File : ADCxDrv.C

8 * Version : V1.0

9 * By : 王宏强

10 *

11 * For : Stm32f10x

12 * Mode : Thumb2

13 * Toolchain :

14 * RealView Microcontroller Development Kit (MDK)

15 * Keil uVision

16 * Description : 定时器驱动

17 * 占用ADCx(ADC1,ADC2)

18 *

19 * 1,DMA规则模式(可靠性低,多路用此模式) 加宏定义 #define ADC_DMA

20 * 2,4路以下,用注入模式(可靠性高,占资源少)

21 *

22 * ADCxOpen

23 * ADCxClose

24 * ADCxWrite

25 * ADCxRead

26 * ADCxIoCtl

27 * ADCxInstall

28 * ADCxNuinstall

29 * Date : 2012.05.22

30 *******************************************************************************/

31

32 #include "ADCxDrv.h"

33

34 //DMA采样缓冲区

35 static volatile INT16U ADC_ConvertedValueTab[MAX_AD_SAMPLE_COUNTER] = {0};

36 static INT16U ADCxBuff[CHANNEL_COUNT] = {0}; //缓冲区数据平均值

37 static INT16U index = 0;

38

39 #ifdef UCOSII

40 static OS_EVENT *adcSem;

41 static INT8U err;

42 #endif

43

44 //总采样时间(单位ms) = 读样个数 * 采样1个值所用时间 / 72mHz * 1000

45 //static INT16U sampingTime = (INT16U)(CHANNEL_COUNT * ADCx_SAMPLE_COUNT *

46 // 239 * 5 / 9e3 + 1);

47

48 /* Private macro -------------------------------------------------------------*/

49 /* Private variables ---------------------------------------------------------*/

50 ADC_InitTypeDef ADC_InitStructure;

51 DMA_InitTypeDef DMA_InitStructure;

52 NVIC_InitTypeDef NVIC_InitStructure;

53

54

55

56 /*******************************************************************************

57 * Function Name :INT16U GetSampleTemp(INT16U order)

58 * Description :获取采样到的数据,并进行平均

59 * Input :order:通道序列号

60 * Output :返回本通道 采样平均值

61 * Other :

62 * Date :2012.05.23 14:48:23

63 *******************************************************************************/

64 static INT16U GetSampleValue(INT16U order)

65 {

66 u32 sum = 0;

67 u16 i = order;

68

69 if (order >= CHANNEL_COUNT) return 0; //序列号超出范围

70

71 for (i = order; i < MAX_AD_SAMPLE_COUNTER; i+=CHANNEL_COUNT)

72 {

73 sum += ADC_ConvertedValueTab[i];

74 }

75 sum /= ADCx_SAMPLE_COUNT;

76

77 return (u16)sum;

78 }

79

80 void StartAdc(FunctionalState stat)

81 {

82 if (stat == ENABLE) index = 0;

83

84 ADC_ITConfig(ADCx, ADC_IT_JEOC, stat);

85 ADC_Cmd(ADCx, stat);

86 }

87

88

89 /*******************************************************************************

90 * Function Name :static INT32S ADCxOpen(void *pd)

91 * Description :

92 * Input :

93 * Output :

94 * Other :

95 * Date :2012.05.23 10:25:06

96 *******************************************************************************/

97 static INT32S ADCxOpen(void *pd)

98 {

99 GPIO_InitTypeDef GPIO_InitStructure;

100 INT32U rccApb = 0;

101 INT16U gpioPin = 0;

102

103 /* Enable peripheral clocks ----------------------------------------------*/

104 /* Enable DMA1 and DMA2 clocks */

105 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMAx, ENABLE);

106

107

108 #if ADCx_GPIOX_1_EN

109 rccApb |= RCC_APBXPeriph_GPIOX_1;

110 #endif

111

112 #if ADCx_GPIOX_2_EN

113 rccApb |= RCC_APBXPeriph_GPIOX_2;

114 #endif

115

116 #if ADCx_GPIOX_3_EN

117 rccApb |= RCC_APBXPeriph_GPIOX_3;

118 #endif

119

120 rccApb |= RCC_APBXPeriph_ADCx;

121 RCC_APB2PeriphClockCmd(rccApb, ENABLE);

122 RCC_ADCCLKConfig(RCC_PCLK2_Div8);

123

124

125 #if ADCx_GPIOX_1_EN

126 gpioPin = 0;

127 #if ADCx_CHANNEL0_EN

128 gpioPin |= ADCx_GPIOX_PIN_CH0;

129 #endif

130 #if ADCx_CHANNEL1_EN

131 gpioPin |= ADCx_GPIOX_PIN_CH1;

132 #endif

133 #if ADCx_CHANNEL2_EN

134 gpioPin |= ADCx_GPIOX_PIN_CH2;

135 #endif

136 #if ADCx_CHANNEL3_EN

137 gpioPin |= ADCx_GPIOX_PIN_CH3;

138 #endif

139 #if ADCx_CHANNEL4_EN

140 gpioPin |= ADCx_GPIOX_PIN_CH4;

141 #endif

142 #if ADCx_CHANNEL5_EN

143 gpioPin |= ADCx_GPIOX_PIN_CH5;

144 #endif

145 #if ADCx_CHANNEL6_EN

146 gpioPin |= ADCx_GPIOX_PIN_CH6;

147 #endif

148 #if ADCx_CHANNEL7_EN

149 gpioPin |= ADCx_GPIOX_PIN_CH7;

150 #endif

151 GPIO_InitStructure.GPIO_Pin = gpioPin;

152 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

153 GPIO_Init(ADCx_GPIOX_1, &GPIO_InitStructure);

154 #endif

155

156

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

特朗普集团近日取消了其新推出的T1智能手机“将在美国制造”的宣传标语,此举源于外界对这款手机能否以当前定价在美国本土生产的质疑。

关键字: 特朗普 苹果 AI

美国总统特朗普在公开场合表示,他已要求苹果公司CEO蒂姆·库克停止在印度建厂,矛头直指该公司生产多元化的计划。

关键字: 特朗普 苹果 AI

4月10日消息,据媒体报道,美国总统特朗普宣布,美国对部分贸易伙伴暂停90天执行新关税政策,同时对中国的关税提高到125%,该消息公布后苹果股价飙升了15%。这次反弹使苹果市值增加了4000多亿美元,目前苹果市值接近3万...

关键字: 特朗普 AI 人工智能 特斯拉

3月25日消息,据报道,当地时间3月20日,美国总统特朗普在社交媒体平台“真实社交”上发文写道:“那些被抓到破坏特斯拉的人,将有很大可能被判入狱长达20年,这包括资助(破坏特斯拉汽车)者,我们正在寻找你。”

关键字: 特朗普 AI 人工智能 特斯拉

1月22日消息,刚刚,新任美国总统特朗普放出重磅消息,将全力支持美国AI发展。

关键字: 特朗普 AI 人工智能

特朗普先生有两件事一定会载入史册,一个是筑墙,一个是挖坑。在美墨边境筑墙的口号确保边境安全,降低因非法移民引起的犯罪率过高问题;在中美科技产业之间挖坑的口号也是安全,美国企业不得使用对美国国家安全构成威胁的电信设备,总统...

关键字: 特朗普 孤立主义 科技产业

据路透社1月17日消息显示,知情人士透露,特朗普已通知英特尔、铠侠在内的几家华为供应商,将要撤销其对华为的出货的部分许可证,同时将拒绝其他数十个向华为供货的申请。据透露,共有4家公司的8份许可被撤销。另外,相关公司收到撤...

关键字: 华为 芯片 特朗普

曾在2018年时被美国总统特朗普称作“世界第八奇迹”的富士康集团在美国威斯康星州投资建设的LCD显示屏工厂项目,如今却因为富士康将项目大幅缩水并拒绝签订新的合同而陷入了僵局。这也导致富士康无法从当地政府那里获得约40亿美...

关键字: 特朗普 富士康

今年5月,因自己发布的推文被贴上“无确凿依据”标签而与推特发生激烈争执后,美国总统特朗普签署了一项行政令,下令要求重审《通信规范法》第230条。

关键字: 谷歌 facebook 特朗普

众所周知,寄往白宫的所有邮件在到达白宫之前都会在他地进行分类和筛选。9月19日,根据美国相关执法官员的通报,本周早些时候,执法人员截获了一个寄给特朗普总统的包裹,该包裹内包含蓖麻毒蛋白。

关键字: 美国 白宫 特朗普
关闭