历史上的今天
返回首页

历史上的今天

今天是:2024年08月26日(星期一)

正在发生

2021年08月26日 | STM32 ADC自我学习总结

2021-08-26 来源:eefocus

记录一下STM32的ADC编程方法!


前面已经学习了DMA,知道如何使用DMA去减小CPU的负担,这里的ADC转换也来使用DMA---这个也是STM32的ADC转换最常见的方式。


---第一步是---了解STM32的ADC对应的GPIO口----如下图---不用记住,可以查询,我是将它剪下来粘贴到书本的相应章节----!

---第二步是---配置相应ADC转换的GPIO口----这里使用PC0--PC1


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);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;  //模拟输入

GPIO_Init(GPIOC, &GPIO_InitStructure); 

}


---第三步是---配置ADC的DMA----配置ADC通道等---


#define ADC1_DR_Address    ((u32)0x40012400+0x4c)  //外设地址

__IO uint16_t ADC_ConvertedValue[2];  //内存数组




static void ADC1_Mode_Config(void)

{

DMA_InitTypeDef DMA_InitStructure;

ADC_InitTypeDef ADC_InitStructure;


DMA_DeInit(DMA1_Channel1);  

//---------------ADC的DMA配置--------------------

DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;  //ADC1地址---代表ADC1保存转换值的寄存器

DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;  //内存地址---用来保存DMA传输过来的ADC转换值----后面直接使用的变量地址

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  //外设为数据源

DMA_InitStructure.DMA_BufferSize = 2;  //传输总数据---2通道需要传输2个数据

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

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址自增---总体表示始终从外设ADC1地址处取值---依次保存到连续的两个内存变量中---

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;   //外设传输数据单元---半字16位

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;  //内存传输数据单元---半字16位

DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  //循环模式---2个数据依次循环接收从外设ADC1传输过来的ADC值---

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);  //再次打开DMA1


        //------------ADC模式配置------------------------

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;  //独立模式----还有很多模式---这个比较常见

ADC_InitStructure.ADC_ScanConvMode = ENABLE ;   //扫描模式---采集多通道使用----本程序采集2通道---所以扫描模式

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;  //连续转换模式---不难理解---就是不停地采集---一次接一次

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;  //不使用外部触发转换---触发分为外部触发---比如中断与定时器。软件触发---后面有专用函数

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;   //采集的数据右对齐---方便计算

ADC_InitStructure.ADC_NbrOfChannel = 2;  //总共需要转换的通道个数---这里2个

ADC_Init(ADC1, &ADC_InitStructure);


RCC_ADCCLKConfig(RCC_PCLK2_Div8);  //配置ADC转换时钟---PCLK2的8分频

        //下面这个函数比较重要----配置ADC的通道与采样周期---前面说的PC0与PC1对应的ADC通道分别是--10与11。采集周期也有几种。

ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_55Cycles5);


ADC_DMACmd(ADC1, ENABLE);  //打开DMA1的ADC1 

ADC_Cmd(ADC1, ENABLE);  //打开ADC1


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

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


ADC_StartCalibration(ADC1);  //ADC校准

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


ADC_SoftwareStartConvCmd(ADC1, ENABLE);  //软件触发转换

}


---第四部分是---在硬件上使用了一个通道切换芯片----CD4052----由PC2---PC3控制通道的选择CD4052切换控制GPIO配置----


void GPIO_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推完输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC, &GPIO_InitStructure);

}


---第五部分是---主函数-----


extern __IO uint16_t ADC_ConvertedValue[2];  //声明外部变量

uint16_t My_ADC[2];  //求平均值


int main(void)

u8 i,led=0x01;


USART1_Config();



ADC1_GPIO_Config();

ADC1_Mode_Config();



while (1)

{

My_ADC[0]=0;

My_ADC[1]=0;



for(i=0;i<10;i++)  

{

                        My_ADC[0]+=ADC_ConvertedValue[0];

My_ADC[1]+=ADC_ConvertedValue[1];

               }

My_ADC[0]=My_ADC[0]/10;   //采集10次求平均值

My_ADC[1]=My_ADC[1]/10;


ADC_ConvertedValueLocal =(float) My_ADC[0]/4096*3.3;   //转换为电压值


printf("rn The current AD---0 value = 0x%04X n", My_ADC[0]); 

printf("The current AD---0 value = %f V n",ADC_ConvertedValueLocal); 


ADC_ConvertedValueLocal =(float) My_ADC[1]/4096*3.3; 


printf("The current AD---1 value = 0x%04X n", My_ADC[1]); 

printf("The current AD---1 value = %f V n",ADC_ConvertedValueLocal);  

}

}

推荐阅读

史海拾趣

Colibrys SA公司的发展小趣事

Colibrys在MEMS技术方面拥有深厚的专业知识,这得益于公司长期的研发积累和不断创新的精神。许多客户委托公司建造最苛刻的航空航天、能源、铁路或汽车测试设备,这些成功案例进一步巩固了公司在行业内的领先地位。无论是用于汽车安全气囊的MEMS加速度计,还是用于引导钻头的高温加速度计,都体现了Colibrys在专业知识应用方面的卓越能力。

晨晶电子(Chenjing Electronics)公司的发展小趣事

晨晶电子的前身是始建于1958年的国营第七O七厂。作为一家具有深厚历史底蕴的企业,它在中国电子行业的发展历程中扮演了重要角色。然而,随着时代的变迁和市场环境的转变,国营第七O七厂逐渐面临着体制僵化、市场竞争力下降等问题。为了适应现代企业制度的要求,该厂在2000年进行了转制,成立了北京晨晶电子有限公司。这一转制不仅为企业注入了新的活力,也为其后续的发展奠定了坚实基础。

安纳森(AnaSem)公司的发展小趣事

在电子行业中,晶振模组是众多电子设备不可或缺的核心组件。安纳森(AnaSem)公司自创立之初,便致力于研发创新的晶振模组技术。面对市场上多数厂家仍依赖传统晶体制作方法的现状,安纳森凭借其深厚的研发实力和前瞻性的技术视野,成功研发出以单体式集成电路为核心的晶振模组制作技术。这一技术的突破不仅大幅提升了晶振模组的性能与稳定性,更使得安纳森在激烈的市场竞争中脱颖而出,迅速占据了行业的一席之地。

ELM Technology Corporation公司的发展小趣事

ELM Technology Corporation非常重视企业文化的建设。公司倡导“创新、协作、诚信、责任”的企业精神,鼓励员工积极创新、勇于担当。同时,公司还为员工提供了良好的工作环境和福利待遇,增强了员工的归属感和凝聚力。这种积极向上的企业文化为ELM的持续发展提供了强大的动力。

请注意,以上故事仅为概述,具体细节和事实需要根据ELM Technology Corporation的实际情况进行补充和完善。

ADMOS公司的发展小趣事

在电子行业竞争日益激烈的背景下,ADMOS公司始终坚守质量第一的原则。公司建立了完善的质量管理体系,从原材料采购到产品生产的每一个环节都进行严格把控。这种对质量的执着追求使得ADMOS的产品在市场上获得了广泛的认可和信任,也为公司赢得了众多长期合作伙伴。

FIDELIX公司的发展小趣事

2015年,中国半导体企业东芯半导体有限公司看中了FIDELIX在存储芯片领域的优势,决定对其进行收购。经过多轮谈判和协商,东芯半导体成功收购了FIDELIX 25.3%的股权,成为其第一大股东及实际控制人。这次收购不仅加强了东芯半导体在存储芯片领域的技术实力,也为FIDELIX提供了更广阔的市场和发展空间。

问答坊 | AI 解惑

【公告】诚邀毕业设计版主

本帖最后由 paulhyde 于 2014-9-15 09:49 编辑 本人对毕业设计部分等不是很熟,故毕业设计部分诚邀一位版主加入,希望可以引领大家一起进行毕业设计的讨论,共同把电子设计大赛/毕业设计版块做好,有意向的请在下面跟贴说明!谢谢!  …

查看全部问答>

全球无线市场10大预测:应用商店无处不在

1.移动数据流量的爆炸式增长将使3G网络面临压力 尽管3G已经商用10年,但2010年3G网络可能将首次面临移动数据流量爆炸式增长所带来的沉重压力。有意思的是过去5年运营商一直在千方百计地增加其3G网络的数据流量,而现在随着像iPhone(手机上网)这样 ...…

查看全部问答>

示波器探头系列二 探头的共有特性概述

李海龙 美国力科公司北京代表处   数字示波器是电子工程师使用最广泛的一种测试测量仪器,从测试系统的角度来看,数字示波器系统包括主机和探头两主要组成部分,示波器探头与主机的关系就好比汽车与轮子,汽车车身通过轮子才能接触到地面, ...…

查看全部问答>

第二次免费开发板赠送,40mb 开发资料包:实例,原理图,keil 正式版,免费下载

第二次免费开发板赠送,40mb 开发资料包:实例,原理图,keil 正式版,免费下载下载50个单片机程序实例和开发板原理图,学林电子免费开发板暑期助学活动报名!暑假在家,就学单片机!申请主贴地址:  http://www.51c51.com/bbs/thread-68995-1-1. ...…

查看全部问答>

XC9572XL配置问题

请问XC9572XL通过一个IO引脚输入27M时钟,通过一个与逻辑单元和VCC相与后,从另外一个IO引脚输出,请问这样能正确输出27M时钟吗? 还有就是已经与其它芯片连接但是暂时未用的引脚应该怎么样处理?(需要设置成为三态输入吗?好像ISE中没这个配置选 ...…

查看全部问答>

当textbox有焦点时 如何设置输入法为英文半角,谢谢!

当textbox有焦点时 如何设置输入法为英文半角,谢谢!…

查看全部问答>

3个本子,哪个性价好?

华硕 A6Jc A6Q23Jc-SL    8299 元 华硕 A6Jc A6Q23Jc-SL 主要性能CPU类型 Intel 酷睿双核 T2300(1.66GHz)   最高主频 1.66GHz   前端总线 667MHz   二级缓存 2048KB   迅驰技术 迅驰III(Na ...…

查看全部问答>

ST选型请指教

功能描述:将一张SD卡的内容快速copy到另外一张。因为刚刚拿到一块ST的三合一开发板,想问问大家,ST有合适的片子能时间这个功能吗?…

查看全部问答>

求DXP2004软件!!!!!

谁有啊 传给我个 QQ526844809 谢谢 急用...................…

查看全部问答>

好吧,我是菜鸟,你们继续~

论坛里的大神们,对于新人,不知道你们是怎么看的,都是从这个阶段来的,都知道一个人埋头向前没人指导的艰难。在菜鸟们苦思冥想得不到结果的时候,可能你们的一句话就点醒了“梦中人”,因为你们也经历过这些,有时候一句话的事反而懒得说。当然你 ...…

查看全部问答>