stm32 adc多通道非dma采集可以不采用dma吗

各位大神,求教啊!!!stm32 adc 多通道采集出错!!!!_stm32吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:26,748贴子:
各位大神,求教啊!!!stm32 adc 多通道采集出错!!!!收藏
哪位大虾指点一下!!!我使用2通道采样DMA传输的时候怎么只有一个通道的数据正确的这是为什么呢?另一路就是屏幕上会出现很多黑色的竖线!!!而且我AD采样各路通道PC0,PC2的时候,AD采集都是正确的!求指导啊!!!/******************** (C) COPYRIGHT 2012 WildFire Team *************************** * 文件名
:adc.c * 描述
:adc应用函数库
* 实验平台:野火STM32开发板 * 硬件连接:---------------------------------------------------- *
| PC1 - ADC1 连接外部电压(通过一个滑动变阻器分压而来)| *
---------------------------------------------------- * 库版本
:wildfire team
:**********************************************************************************/#include "adc.h"#define ADC1_DR_Address
((u32)0xx4c)__IO uint16_t AD_Value[2];
//定义数组AD_Value[2];
存放2个通道的值__IO uint16_t ADC_ConvertedV//__IO u16 ADC_ConvertedValueL/* * 函数名:ADC1_GPIO_Config * 描述
:使能ADC1和DMA1的时钟,初始化PC.01 * 输入
: 无 * 输出
:无 * 调用
:内部调用 */static void ADC1_GPIO_Config(void){
GPIO_InitTypeDef GPIO_InitS
/* Enable DMA clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* Enable ADC1 and GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);
/* Configure PC.01
as analog input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// PC0,输入时不用设置速率
/* Configure PC.01
as analog input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// PC2,输入时不用设置速率}/* 函数名:ADC1_Mode_Config * 描述
:配置ADC1的工作模式为MDA模式 * 输入
: 无 * 输出
:无 * 调用
:内部调用 */static void ADC1_Mode_Config(void){
DMA_InitTypeDef DMA_InitS
ADC_InitTypeDef ADC_InitS
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA时钟
/* DMA channel1 configuration */
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_A
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_V//内存地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
//BufferSize=2,因为ADC转换序列有2个通道
//如此设置,使序列1结果放在AD_Value[0],序列2结果放在AD_Value[1]
DMA_InitStructure.DMA_BufferSize = 64;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_D//外设地址固定
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_E
//内存地址递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfW
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfW
//循环模式开启,Buffer写满后,自动回到初始地址开始传输
DMA_InitStructure.DMA_Mode = DMA_Mode_C
//循环传输
DMA_InitStructure.DMA_Priority = DMA_Priority_H
DMA_InitStructure.DMA_M2M = DMA_M2M_D
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
DMA_Cmd(DMA1_Channel1, ENABLE);
//配置完成后,启动DMA通道
/* ADC1 configuration */
ADC_InitStructure.ADC_Mode = ADC_Mode_I
//独立ADC模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE ;
//禁止扫描模式,扫描模式用于多通道采集
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
//开启连续转换模式,即不停地进行ADC转换
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_N
//不使用外部触发转换
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_R
//采集数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 2;
//要转换的通道数目2
ADC_Init(ADC1, &ADC_InitStructure);
/*配置ADC时钟,为PCLK2的8分频,即9Hz*/
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
/*配置ADC1的通道11为55.
5个采样周期,序列为1 */
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 2, ADC_SampleTime_55Cycles5);
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/*复位校准寄存器 */
ADC_ResetCalibration(ADC1);
/*等待校准寄存器复位完成 */
while(ADC_GetResetCalibrationStatus(ADC1));
/* ADC校准 */
ADC_StartCalibration(ADC1);
/* 等待校准完成*/
while(ADC_GetCalibrationStatus(ADC1));
/* 由于没有采用外部触发,所以使用软件触发ADC转换 */
ADC_SoftwareStartConvCmd(ADC1, ENABLE);}/* * 函数名:ADC1_Init * 描述
:无 * 输入
:无 * 输出
:无 * 调用
:外部调用 */void ADC1_Init(void){
ADC1_GPIO_Config();
ADC1_Mode_Config();}/******************* (C) COPYRIGHT 2012 WildFire Team *****END OF FILE************/
南京stm32培训,美国上市教育公司出品,15年嵌入式培训经验,不就业免费重学!达内stm32培训“先就业,后付款”全国103家培训中心,随时学习,有实力,有保障
第一次采样丢弃,接受第二次采样
登录百度帐号推荐应用16979人阅读
STM32(43)
STM32通过DMA采集多通道AD
本文博客链接:,作者:jdh,转载请注明.
开发环境: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_InitS
DMA_InitTypeDef DMA_InitS
GPIO_InitTypeDef GPIO_InitS
//---------------------充电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)ADCConvertedV
//dma传输方向单向
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
//设置DMA在传输时缓冲区的长度
DMA_InitStructure.DMA_BufferSize = 20;
//设置DMA的外设递增模式,一个外设
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_D
//设置DMA的内存递增模式
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_E
//外设数据字长
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfW
//内存数据字长
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfW
//设置DMA的传输模式:连续不断的循环模式
DMA_InitStructure.DMA_Mode = DMA_Mode_C
//设置DMA的优先级别
DMA_InitStructure.DMA_Priority = DMA_Priority_H
//设置DMA的2个memory中的变量互相访问
DMA_InitStructure.DMA_M2M = DMA_M2M_D
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
//使能通道1
DMA_Cmd(DMA1_Channel1, ENABLE);
//ADC1配置
//独立工作模式
ADC_InitStructure.ADC_Mode = ADC_Mode_I
//扫描方式
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
//连续转换
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
//外部触发禁止
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_N
//数据右对齐
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_R
//用于转换的通道数
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 *
//获得放电电压
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 *
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1226364次
积分:14025
积分:14025
排名:第930名
原创:177篇
转载:19篇
评论:572条
阅读:31670
阅读:67507
文章:19篇
阅读:295334
阅读:23758
(7)(4)(1)(1)(3)(5)(3)(5)(2)(2)(2)(4)(3)(8)(2)(4)(2)(2)(1)(3)(4)(5)(1)(2)(4)(5)(6)(2)(1)(1)(4)(2)(1)(1)(2)(3)(1)(6)(5)(1)(6)(9)(11)(5)(4)(8)(18)(2)(2)(1)(1)(3)(2)(3)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'STM32的ADC采样(非DMA方式)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
STM32的ADC采样(非DMA方式)
&&不用DMA 的 STM32多路ADC采样方式!
你可能喜欢

我要回帖

更多关于 stm32f103 adc dma 的文章

 

随机推荐