历史上的今天
返回首页

历史上的今天

今天是:2025年02月20日(星期四)

正在发生

2020年02月20日 | STM32笔记--ADC(DMA方式)

2020-02-20 来源:eefocus

在上一次的博客中重新学习了DMA,这次我们便学以致用了,ADC的概念想必大家都是十分清楚了,模拟转数字,可以用在测信号,测电压,在我们的生活中有着十分巨大的作用,这次我们就来看看ADC又有哪些操作吧!


ADC流程,首先ADC采集一个信号(信号范围大都为0-3.3V,ps:3.3V可通过更改Vref寄存器修改),每隔相同时间菜一次数值发送到一个可变16位数中,下面是我们的数组定义:


__IO uint16_t ADC_ConvertedValue;    //定义该16位数用来传输数据,原因是我们使用的12位AD,由于寄存器的定义方便,因此使用16位数

下面是ADC的初始化和配置代码:


void ADC1_Init(void)

{

ADC1_GPIO_Config();     //下面有详细的代码配置

ADC1_Mode_Config();

}

 

static void ADC1_GPIO_Config(void)

{

 GPIO_InitTypeDef GPIO_InitStructure;    //定义写入寄存器的结构体

 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  //使能时钟,注意使能的是DMA1

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE); //本实验使用的是GPIOC1,使能ADC1,GPIO时钟

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;  //配置为PC.1    

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;  //设置为模拟输入 

 GPIO_Init(GPIOC, &GPIO_InitStructure);    // 初始化写入寄存器中

}

 

static void ADC1_Mode_Config(void)

{

 DMA_InitTypeDef DMA_InitStructure;   //定义写入DMA寄存器的结构体

 ADC_InitTypeDef ADC_InitStructure;   //定义写入ADC寄存器的结构体

 DMA_DeInit(DMA1_Channel1);  //复位初始化,配置为复位模式,下面我们再重新配置(不知道有用没)

 DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;    //设置源地址

 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; //设置内存地址

 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  // 设置传输方向

 DMA_InitStructure.DMA_BufferSize = 1;    //因为我们最后一直改变一个变量,所以只有一位

 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址固定

 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;      //内存地址固定

 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //外设传输数据大小为半字

 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;   //内存传输数据大小为半字

 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;          //循环模式

 DMA_InitStructure.DMA_Priority = DMA_Priority_High;    //高优先级

 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;     //禁止内存间传输数据

 DMA_Init(DMA1_Channel1, &DMA_InitStructure);    //将结构体写入寄存器中

 

 DMA_Cmd(DMA1_Channel1, ENABLE);    //使能DMA寄存器的1通道

 

 /* ADC1 configuration */ 

 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;   //因为只有一个通道,所以为独立ADC模式

 ADC_InitStructure.ADC_ScanConvMode = DISABLE ;       //一个通道,所以不使能扫描模式

 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;   //开启连续转换,就是不停转换

 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不使用外部触发,外部触发只有几个固定引脚,详情看手册

 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  //我们定义16位数,采集12位,所以要定义对齐方向,在这我们采取右对齐

 ADC_InitStructure.ADC_NbrOfChannel = 1;          //要转换的通道数目

 ADC_Init(ADC1, &ADC_InitStructure);          ////将结构体写入寄存器中

 

 RCC_ADCCLKConfig(RCC_PCLK2_Div8);   //72M时钟8分频为9M PS:ADC最大时钟速率为14M,后面解释

 

 ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_55Cycles5);  //初始化,采样时间为55.5us,采样序号是1,PS:采样时间最                                                                         // 为1.5us,转换时间为固定12.5us,所以相当于采集完一次数为14us

 ADC_DMACmd(ADC1, ENABLE);   //  使能DMA1 

 ADC_Cmd(ADC1, ENABLE);   //使能ADC1 

 ADC_ResetCalibration(ADC1);   //复位校准寄存器

 while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准寄存器完成 

 ADC_StartCalibration(ADC1);   //ADC校准

 while(ADC_GetCalibrationStatus(ADC1));  //等待校准完成 

 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1的软件触发

}


以上就是我们用到的ADC的配置代码,若要读出ADC的数值,只需要调用我们的输出寄存器值就可完成,下面有个小例子,结合之前的串口通信代码,可将采集到的AD数值发送到电脑串口调试助手上


while (1)

{

ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3; // 转化 PS:将0-3.3分成4096份,ADC读出的是多少份,所以以这                                                                                //样计算

printf("rn The current AD value = 0x%04X rn", ADC_ConvertedValue); 

printf("rn The current AD value = %f V rn",ADC_ConvertedValueLocal);     //打印,USART代码  链接:点击打开链接

Delay(0xffffee);   //延时

}

推荐阅读

史海拾趣

Altech公司的发展小趣事

为了适应市场的快速变化和公司业务的不断扩张,Altech公司决定将深圳工厂整体搬迁至广州南沙。这一搬迁不仅优化了公司的生产布局,还为公司提供了更加广阔的市场发展空间。搬迁后的工厂引进了先进的生产设备和技术,进一步提升了公司的生产效率和产品质量。

Analytic Instruments Corp公司的发展小趣事

Analytic Instruments Corp成立于XXXX年,最初由几位热衷于电子测量与分析技术的工程师创立。他们凭借对行业的深刻理解和敏锐的市场洞察力,研发出了一款具有创新性的电子测量仪器,该仪器在精度和稳定性上均优于市场上的同类产品。这一技术突破使得公司在创业初期就获得了市场的认可,为后续的发展奠定了坚实的基础。

General Electric Solid State公司的发展小趣事

随着电子行业的快速发展和技术的不断进步,Analytic Instruments Corp面临着日益激烈的市场竞争。为了保持领先地位,公司不断调整产品结构和市场策略,积极应对行业变革。公司加大了研发投入,推出了一系列具有创新性和竞争力的新产品。同时,公司还加强了与客户的沟通和合作,深入了解客户需求,为客户提供更加个性化的解决方案。

Aces Electronics Co Ltd公司的发展小趣事

在发展过程中,Aces也面临过各种挑战和危机。例如,原材料价格波动、市场竞争激烈、贸易壁垒等因素都曾经给公司带来不小的压力。然而,Aces凭借敏锐的市场洞察力和强大的危机管理能力,成功应对了这些挑战。公司及时调整采购策略、优化产品结构、拓展销售渠道等措施,有效缓解了外部压力,保持了稳定的发展态势。

这些故事虽然基于假设和推测,但反映了一个电子企业在发展过程中可能遇到的各种情况。无论面对技术挑战、市场竞争还是行业变革,Aces Electronics Co., Ltd.都展现了坚韧不拔、勇往直前的精神风貌。未来,公司将继续致力于技术创新和市场拓展,为电子行业的发展贡献更多力量。

Doodle Labs公司的发展小趣事

随着技术的不断进步和市场的不断变化,Doodle Labs意识到单一产品无法满足多样化的客户需求。因此,公司开始加大研发投入,不断推出新的产品线。其中,最为引人注目的是一款名为Helix的六波段智能无线电产品,它能够在1625-2500MHz的频率范围内工作,为无人机提供全方位的通信支持。这款产品一经推出就受到了市场的热烈欢迎,Doodle Labs也因此获得了更多的关注和认可。

Engelking Elektronik GmbH公司的发展小趣事

为了进一步提升技术实力和产品竞争力,Engelking Elektronik积极寻求与高校和研究机构的合作。通过与多家知名科技院校的合作,公司获得了多项技术专利和研发成果。其中,一项重要的技术突破是开发了一种新型的高效能电子元件,该元件在能效和可靠性方面均达到了行业领先水平。这一成果不仅为公司带来了可观的经济效益,也提升了公司在业界的地位。

问答坊 | AI 解惑

FPGA任意分频包括小数分频设计

本帖最后由 paulhyde 于 2014-9-15 09:23 编辑    赶快下载吧,很好的分频措施,可以做到任意整数分频,小数分频  …

查看全部问答>

急急急 大4毕业设计开题报告

基于单片机的激光警戒系统设计,如题,麻烦好新人给点借鉴~查资料实在不好查,谢谢…

查看全部问答>

测试流接口驱动的测试程序如何写啊?

怎么写测试流接口驱动的测试程序啊?就是在应用程序中如果调用流接口驱动的那几个接口函数啊? 呵呵 有个简单的例子更好。。…

查看全部问答>

求sim300网络测试软件

跪求sim300服务器端的测试软件!!!!!! 可以接受sim300的连接请求,接收gprs发送过来的数据。。。…

查看全部问答>

多线程问题

由于电脑上没有安装linux,请问以下程序的运行结果是什么?谢谢 #include #include #include #include #include pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; int lock_var; time_t end_time; int sum; void pthread1(void ...…

查看全部问答>

在Win CE下访问局域网使用密码的处理

在Win CE 5.0下,首次通过局域网访问另外一台电脑的时候会弹出一个对话框,要求输入对方的用户名、密码和域名。像下图所示的: 我想知道的是,有没有这样一个函数,提供了这几个参数的接口,以便我在写程序时就可以把用户名、密码写进去,而不需 ...…

查看全部问答>

Bootloader 的结构

    在移植之前先了解Bootloader 的一些通用概念,对理解它的代码会有所帮助。    嵌入式Linux 系统从软件的角度通常可以分为以下4 个层次。   (1)引导加载程序,包括固化在固件(firmware)中的boot 代 ...…

查看全部问答>

DIY FPGA学习板 新鲜出炉

拖了很久了,呵呵,是在不要意思   先睹为快,上图     来个3D的 …

查看全部问答>

只想用定时计数PWM功能的时候,用汇编可行吗?

对它的高速度PWM感兴趣,如果不写复杂的算法和人机界面,单纯用汇编语言可行吗?哪些开发工具最简单易用?  我的意思是既然STM32那么便宜,功能强大速度快,干脆大大小小的项目都用这个,省得好多种单片机感觉很累。…

查看全部问答>

使用XTR106的位置检测电路

工业上应用的使用XTR106(XTR104)的位置检测电路。稍加改进即可应用在其他方面用作位置检测控制。  …

查看全部问答>