历史上的今天
返回首页

历史上的今天

今天是:2025年05月13日(星期二)

正在发生

2018年05月13日 | STM32通过DMA采集多通道AD

2018-05-13 来源:eefocus

环境:

主机:XP

开发环境:MDK4.23

MCU:STM32F103CBT6


说明:

通过脚PA1,PA2采集AD。每路AD采集10次。

#include "ad_driver.h"  

  

//全局变量  

//AD采样存放空间  

__IO uint16_t ADCConvertedValue[20];  

  

//函数  

//初始化AD  

void init_ad(void)  

{  

    ADC_InitTypeDef ADC_InitStructure;  

    DMA_InitTypeDef DMA_InitStructure;  

    GPIO_InitTypeDef GPIO_InitStructure;  

  

    //---------------------充电AD初始化--------------------  

    //启动DMA时钟  

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  

  

    //启动ADC1时钟  

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);  

  

    //采样脚设置  

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;  

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;  

    GPIO_Init(GPIOA, &GPIO_InitStructure);  

  

    //DMA1通道1配置  

    DMA_DeInit(DMA1_Channel1);  

    //外设地址  

    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_ADDRESS;  

    //内存地址  

    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADCConvertedValue;  

    //dma传输方向单向  

    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  

    //设置DMA在传输时缓冲区的长度  

    DMA_InitStructure.DMA_BufferSize = 20;  

    //设置DMA的外设递增模式,一个外设  

    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  

    //设置DMA的内存递增模式  

    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  

    //外设数据字长  

    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  

    //内存数据字长  

    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;  

    //设置DMA的传输模式:连续不断的循环模式  

    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  

    //设置DMA的优先级别  

    DMA_InitStructure.DMA_Priority = DMA_Priority_High;  

    //设置DMA的2个memory中的变量互相访问  

    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  

    DMA_Init(DMA1_Channel1, &DMA_InitStructure);  

      

    //使能通道1  

    DMA_Cmd(DMA1_Channel1, ENABLE);  

  

    //ADC1配置  

    //独立工作模式  

    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;  

    //扫描方式  

    ADC_InitStructure.ADC_ScanConvMode = ENABLE;  

    //连续转换  

    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;  

    //外部触发禁止  

    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;  

    //数据右对齐  

    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  

    //用于转换的通道数  

    ADC_InitStructure.ADC_NbrOfChannel = 2;  

    ADC_Init(ADC1, &ADC_InitStructure);  

      

    //规则模式通道配置  

    ADC_RegularChannelConfig(ADC1, ADC_Channel_1 , 1, ADC_SampleTime_239Cycles5);  

    ADC_RegularChannelConfig(ADC1, ADC_Channel_2 , 2, ADC_SampleTime_239Cycles5);  

      

    //使能ADC1的DMA  

    ADC_DMACmd(ADC1, ENABLE);  

      

    //使能ADC1  

    ADC_Cmd(ADC1, ENABLE);  

      

    //使能ADC1复位校准寄存器    

    ADC_ResetCalibration(ADC1);  

    //检查校准寄存器是否复位完毕  

    while(ADC_GetResetCalibrationStatus(ADC1));  

      

    //开始校准  

    ADC_StartCalibration(ADC1);  

    //检测是否校准完毕  

    while(ADC_GetCalibrationStatus(ADC1));  

       

    //开启ADC1的软件转换  

    ADC_SoftwareStartConvCmd(ADC1, ENABLE);  

}  

  

//获得充电电压  

float voltage_charge(void)  

{  

    uint8_t i = 0;  

    uint16_t sum = 0;  

    float v = 0;  

  

    //取得10次充电电压平均值  

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

    {  

        sum += ADCConvertedValue[i * 2];   

    }  

    sum /= 10;  

    //变换成电压值  

    v = 0.002991 * sum;  

  

    return v;  

}  

  

//获得放电电压  

float voltage_discharge(void)  

{  

    uint8_t i = 0;  

    uint16_t sum = 0;  

    float v = 0;  

  

    //取得10次充电电压平均值  

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

    {  

        sum += ADCConvertedValue[i * 2 + 1];   

    }  

    sum /= 10;  

    //变换成电压值  

    v = 0.002991 * sum;  

  

    return v;  

}  


推荐阅读

史海拾趣

浙江东亚电子(DongYa)公司的发展小趣事

浙江东亚电子不仅在国内市场上取得了显著成绩,还积极开拓国际市场。公司已为多家世界五百强企业、上市公司提供服务,如华为、中兴、通用电气及西门子等。通过与这些国际知名企业的合作,公司不仅提升了自身品牌的影响力,还积累了丰富的国际市场经验。

Gang Song Electronics Co Ltd公司的发展小趣事

GainSpan公司成立于行业技术日新月异的时代,专注于超低功耗WiFi系统芯片和模块的设计、开发和制造。其创始团队凭借对物联网(IoT)市场的敏锐洞察,认为低功耗技术将是未来智能家居、可穿戴设备和工业物联网等领域的关键。通过不断的技术研发,GainSpan逐渐在行业内建立了自己的技术优势,为后来的并购奠定了基础。

Eby Company公司的发展小趣事

eBay积极履行社会责任,参与多项公益活动。例如,在疫情期间,eBay向中国红十字基金会捐赠了人民币100万元,用于支援疫情防控工作。此外,eBay还鼓励卖家和买家参与环保活动,如回收旧电子产品等。这些公益活动不仅展示了eBay的社会责任感,也提高了其品牌形象和用户忠诚度。

请注意,以上故事概要仅基于eBay的历史和关键事件进行了简要描述,并未达到每个故事至少500字的要求。如需更详细的故事内容,请参考相关书籍、新闻报道或官方资料。

FILTRAN公司的发展小趣事

eBay一直致力于创新和改革,以适应不断变化的市场环境。例如,eBay推出了“新卖家金鹰计划”,旨在通过多项专属服务扶持新卖家拓展全球市场。此外,eBay还不断更新其技术平台,提高交易效率和用户体验。这些创新和改革措施使eBay能够在竞争激烈的电子行业中保持领先地位。

Arctic Silicon Devices公司的发展小趣事

在电子行业的发展过程中,创新合作是推动产业进步的重要动力。Arctic Silicon Devices积极与高校、科研机构等合作,共同开展技术研发和人才培养。通过共享资源、互通有无,公司不仅获得了更多的创新灵感和技术支持,还推动了整个电子行业的技术进步和产业升级。

Hpc Technology Inc公司的发展小趣事

面对全球电子市场的竞争压力,Arctic Silicon Devices制定了国际化发展战略。公司积极拓展海外市场,通过设立分支机构、与当地企业合作等方式,将产品和技术推向全球。同时,公司还加大了对国际人才的引进力度,提升了自身的研发实力和市场竞争力。这一战略的成功实施,使Arctic Silicon Devices在全球电子行业中占据了重要地位。

问答坊 | AI 解惑

钱不一定要多,感觉幸福就行!

我们打工的,无论怎么样和有钱人比,都是穷光蛋。还不如调整心态,钱不要多,感觉幸福就可以了饿…

查看全部问答>

关于keil的使用,请高手指教

我买了一块c8051f020DK的开发板,原来板上标配的液晶是不带字库的(控制芯片KS0108),然后我自己又去买了块带字库的(控制芯片st7920),我接在了板上的引出脚上。今天调试的时候发现,进入调试环境后,直接就跳入了汇编界面,我切换到C程序界面发 ...…

查看全部问答>

C51刚学习~~

昨天学习跑马灯~几乎没什么错误~~兴奋了一晚~~~ 今天试着写入按键的程序~都没有反应~郁闷了半天~~ 代码如下(书本上的代码) 编译没错也没警告~~ 下载到单片机~按了几下按钮 LED灯都没反应 郁闷啊~~~不知道是单片机的按钮坏了 还是其它原因~~ /** ...…

查看全部问答>

OH51.EXE 与oh51.exe有什么区别

在keil 的安装目录有 c51.exe 和cx51..exe OH51.EXE 与oh51.exe有什么区别…

查看全部问答>

ipc的培训课程哪里有

听说强博康公司做的非常不错   不知道是不是的   网上对这家公司的评价也很高…

查看全部问答>

顾名思“意”:Internet问与答

本帖最后由 jameswangsynnex 于 2015-3-3 20:01 编辑 Q:Internet存在中心吗? A:虽然有时类似Microsoft和Netscape这样的公司认为自己是Internet的中心,但就像宇宙没有中心一样,Internet也不存在着一个中心。因为每一台计算机都连接着其它计算 ...…

查看全部问答>

求各位高手 大哥们 帮帮小弟

能不能给我发个  bc3.1     bc4.5    谢谢了  572058869@qq.com…

查看全部问答>

语音录放系统实验

做语音录放系统实验,录音的数字量存在flash中,如何将它们播放出去呢?我是用定时器输出PWM来实现播放语音的,那PWM的频率如何确定?PWM的占空比如何确定? [ 本帖最后由 zzbaizhi 于 2013-7-5 11:34 编辑 ]…

查看全部问答>

求助,关于RS232和TTL的转换

最近需要用一个条形码模块,输出是RS232的,我用232转USB的线连到电脑上,是可以读数据的。但是加上232转TTL,TTL再转USB就不能读数据了,VCC看过了,也是匹配的。 有没有人遇到过这样的问题啊?求大神解答。 …

查看全部问答>