首页 > 应用 > 单片机应用
[导读]在做有AD模块项目的时候遇到几个问题:1, ADC配合DMA采样规则是怎样的。2, ADC在DMA采可否不连续采样,以提高有效采样使用率和降低功耗。3, 如何提高有效利用率和降低功耗,并减少CPU的占用时间。4, ADC的如何多
在做有AD模块项目的时候遇到几个问题:本文引用地址: http://www.21ic.com/app/mcu/201901/784482.htm1, 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 : Stm32f10x12 * Mode : Thumb213 * Toolchain :14 * RealView Microcontroller Development Kit (MDK)15 * Keil uVision16 * Description : 定时器驱动17 * 占用ADCx(ADC1,ADC2)18 * 19 * 1,DMA规则模式(可靠性低,多路用此模式) 加宏定义 #define ADC_DMA20 * 2,4路以下,用注入模式(可靠性高,占资源少)21 * 22 * ADCxOpen23 * ADCxClose24 * ADCxWrite25 * ADCxRead26 * ADCxIoCtl27 * ADCxInstall28 * ADCxNuinstall29 * Date : 2012.05.2230 *******************************************************************************/3132 #include "ADCxDrv.h"3334 //DMA采样缓冲区35 static volatile INT16U ADC_ConvertedValueTab[MAX_AD_SAMPLE_COUNTER] = {0};36 static INT16U ADCxBuff[CHANNEL_COUNT] = {0}; //缓冲区数据平均值37 static INT16U index = 0;3839 #ifdef UCOSII40 static OS_EVENT *adcSem;41 static INT8U err;42 #endif4344 //总采样时间(单位ms) = 读样个数 * 采样1个值所用时间 / 72mHz * 100045 //static INT16U sampingTime = (INT16U)(CHANNEL_COUNT * ADCx_SAMPLE_COUNT *46 // 239 * 5 / 9e3 + 1); 4748 /* Private macro -------------------------------------------------------------*/49 /* Private variables ---------------------------------------------------------*/50 ADC_InitTypeDef ADC_InitStructure;51 DMA_InitTypeDef DMA_InitStructure;52 NVIC_InitTypeDef NVIC_InitStructure;53545556 /*******************************************************************************57 * Function Name :INT16U GetSampleTemp(INT16U order)58 * Description :获取采样到的数据,并进行平均59 * Input :order:通道序列号60 * Output :返回本通道 采样平均值61 * Other :62 * Date :2012.05.23 14:48:2363 *******************************************************************************/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 }7980 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 }878889 /*******************************************************************************90 * Function Name :static INT32S ADCxOpen(void *pd)91 * Description :92 * Input :93 * Output :94 * Other :95 * Date :2012.05.23 10:25:0696 *******************************************************************************/97 static INT32S ADCxOpen(void *pd)98 {99 GPIO_InitTypeDef GPIO_InitStructure;100 INT32U rccApb = 0;101 INT16U gpioPin = 0;102103 /* Enable peripheral clocks ----------------------------------------------*/104 /* Enable DMA1 and DMA2 clocks */105 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMAx, ENABLE);106107108 #if ADCx_GPIOX_1_EN109 rccApb |= RCC_APBXPeriph_GPIOX_1;110 #endif111112 #if ADCx_GPIOX_2_EN113 rccApb |= RCC_APBXPeriph_GPIOX_2;114 #endif115116 #if ADCx_GPIOX_3_EN117 rccApb |= RCC_APBXPeriph_GPIOX_3;118 #endif119120 rccApb |= RCC_APBXPeriph_ADCx;121 RCC_APB2PeriphClockCmd(rccApb, ENABLE);122 RCC_ADCCLKConfig(RCC_PCLK2_Div8);123124 125 #if ADCx_GPIOX_1_EN126 gpioPin = 0;127 #if ADCx_CHANNEL0_EN128 gpioPin |= ADCx_GPIOX_PIN_CH0;129 #endif130 #if ADCx_CHANNEL1_EN131 gpioPin |= ADCx_GPIOX_PIN_CH1;132 #endif133 #if ADCx_CHANNEL2_EN134 gpioPin |= ADCx_GPIOX_PIN_CH2;135 #endif136 #if ADCx_CHANNEL3_EN137 gpioPin |= ADCx_GPIOX_PIN_CH3;138 #endif139 #if ADCx_CHANNEL4_EN140 gpioPin |= ADCx_GPIOX_PIN_CH4;141 #endif142 #if ADCx_CHANNEL5_EN143 gpioPin |= ADCx_GPIOX_PIN_CH5;144 #endif145 #if ADCx_CHANNEL6_EN146 gpioPin |= ADCx_GPIOX_PIN_CH6;147 #endif148 #if ADCx_CHANNEL7_EN149 gpioPin |= ADCx_GPIOX_PIN_CH7;150 #endif151 GPIO_InitStructure.GPIO_Pin = gpioPin;152 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;153 GPIO_Init(ADCx_GPIOX_1, &GPIO_InitStructure);154 #endif155156
换一批

延伸乐虎国际娱乐手机版

[单片机应用] 基于stm32f103zet6的定时器的学习3(定时器产生4路PWM)

基于stm32f103zet6的定时器的学习3(定时器产生4路PWM)定时器TIM3产生四路PWM波输出。首先介绍一下PWM吧,算是给自己充电,脉冲宽度调制(PWM),是英文“Pulse Width Modulation ”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技......关键字:stm32f103zet6 定时器 PWM

[单片机应用] STM32使用ADC功能

STM32使用ADC功能1.关于ADC输入通道与GPIO口的输入关系需要查看STM32芯片手册(p31)而非数据手册。2.外部触发源指的是触发ADC采样的触发信号,这与1的GPIO口输入是两个不同概念。而JEXTBEL[2:0]或者EXTBEL[2:0]决定具体是......关键字:STM32 ADC功能

[单片机应用] STM32F103ZET6 之 通用定时器单脉冲模式实验

STM32F103ZET6 之 通用定时器单脉冲模式实验由于前面买的核心板,供电老有问题,使得我现在的项目又改用了以前用的F103ZET6微控制器!1、实验目的1)产生脉宽任意可调的单脉冲(在允许的范围内)2、硬件:通用定时器3、通用定时器43、单脉冲模式介绍单脉冲模式......关键字:STM32F103ZET6 通用定时器 单脉冲模式

[单片机应用] 89C51单片机与1片ADC0809组成的数据采集系统编程实例

89C51单片机与1片ADC0809组成的数据采集系统编程实例在1个由89C51单片机与1片ADC0809组成的数据采集系统中,ADC0809的8个输入通道的地址为7FF8H~7FFFH,试画出有关接口电路图,并编写出每隔1分钟轮流采集1次8个通道数据的程序,共采样50次,其采样值存入内RAM20H单......关键字:89C51 单片机 ADC0809 数据采集系统

[单片机应用] STM32F103VCT6低功耗测试(待机模式)

STM32F103VCT6低功耗测试(待机模式)只测试了待机模式,待机模式实现系统的最低功耗。原理图如下,一开始全部焊接了,其中S2用来进入待机,S1用来唤醒测试程序为:#include"stm32f10x.h"#include"system_stm32f1......关键字:STM32F103VCT6 低功耗测试 待机模式

[单片机应用] STM32F407的ADC单次转换

STM32F407的ADC单次转换用到的引脚是PA3也就是ADC1的通道31、ADC的主要参数a、分辨率----stm32f407的分辨率有6位、8位、10位、12位,参考电压如果是3.3 那么最小分辨率就是3.3/4095。b、转换时间----stm32f407的最高允许......关键字:STM32F407 ADC 单次转换

[单片机应用] STM32系列第18篇--ADC

STM32系列第18篇--ADCADC特点:12位逐次逼近型的模拟数字转换器最多带3个ADC控制器最多支持18个通道,可最多测量16个外部和2个内部信号源支持单次和连续转换模式通道0到通道n的自动扫描模式自动校准采样间隔可以按通道编程规则通道和注入......关键字:STM32系列 ADC

[单片机应用] 实验6 ADC

实验6 ADCADC,Analog-to-Digital Converter的缩写,指模/数转换器或者模数转换器。是指将连续变化的模拟信号转换为离散的数字信号的器件。真实世界的模拟信号,例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和......关键字:ADC stm8 单片机 机器人

[单片机应用] STM32F404的ADC之DMA的单通道

STM32F404的ADC之DMA的单通道这里是接前面的文章PA3 ADC1的通道3下面是完整的程序__IO uint16_t AdcValue =0;/****************************************************************......关键字:STM32F404 ADC DMA 单通道

[智能硬件] 苹果也要推可折叠设备!又获得一项跟可折叠iPhone相关的专利

苹果也要推可折叠设备!又获得一项跟可折叠iPhone相关的专利苹果最新的专利被简单地称为“柔性显示设备”,编号为10,104,787。根据专利文件的描述:“柔性显示屏可以安装在与铰链重叠的外壳部分。当设备的壳体部分相对于彼此旋转时,柔性显示屏可能会弯曲。” ......关键字:苹果 可折叠设备 iPhone

我 要 评 论

网友评论

芯闻号

技术子站

更多

项目外包

更多

推荐博客