OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2010|回复: 2

stm32DMA多路ADC采样不能正确输出

[复制链接]

2

主题

5

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2020-10-28
在线时间
1 小时
发表于 2023-7-12 21:12:29 | 显示全部楼层 |阅读模式
10金钱
希望采用stm32F1采集6路ADC,用DMA把数据采集到数组中,但是结果不正确,工程已经随带,代码如下:


  • u16 adc_original_data[6] = {0};











  • void  Adc_Init(void)



  • {     







  •     ADC_InitTypeDef ADC_InitStructure;



  •     GPIO_InitTypeDef GPIO_InitStructure;



  •     DMA_InitTypeDef DMA_InitStructure;







  •     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA时钟



  •     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );//使能端口A时钟



  •     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE );//使能ADC1通道时钟







  •     //初始化DMA



  •     DMA_DeInit(DMA1_Channel1);//将DMA的通道1寄存器重设为缺省值







  •     DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)( ADC1_BASE+0x4c);//DMA外设ADC基地址



  •     DMA_InitStructure.DMA_MemoryBaseAddr = (u32)adc_original_data;//DMA内存基地址



  •     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  //数据传输方向,从外设读到内存



  •     DMA_InitStructure.DMA_BufferSize = 6;//总接收发数据长度



  •     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址寄存器不变



  •     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存地址寄存器递增



  •     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//数据宽度为16



  •     DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord; //数据宽度为16



  •     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  //工作在循环模式



  •     DMA_InitStructure.DMA_Priority = DMA_Priority_High;// 当使用一个DMA通道时,优先级设置不影响



  •     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//DMA通道x没有设置为内存到内存传输



  •     DMA_Init(DMA1_Channel1, &DMA_InitStructure);   







  •     // 使能 DMA 通道



  •     DMA_Cmd(DMA1_Channel1 , ENABLE);















  •     //PA1 作为模拟通道输入引脚                        



  •     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;



  •     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;        //模拟输入引脚



  •     GPIO_Init(GPIOA, &GPIO_InitStructure);   







  •     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;



  •     GPIO_Init(GPIOA, &GPIO_InitStructure);







  •     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;



  •     GPIO_Init(GPIOA, &GPIO_InitStructure);







  •     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;



  •     GPIO_Init(GPIOA, &GPIO_InitStructure);







  •     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;



  •     GPIO_Init(GPIOA, &GPIO_InitStructure);







  •     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;



  •     GPIO_Init(GPIOA, &GPIO_InitStructure);











  •     ADC_DeInit(ADC1);//复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值







  •     RCC_ADCCLKConfig(RCC_PCLK2_Div8);//设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M







  •     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC工作模式:ADC1和ADC2工作在独立模式



  •     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数据右对齐



  •     ADC_InitStructure.ADC_NbrOfChannel = 6;//顺序进行规则转换的ADC通道的数目



  •     ADC_Init(ADC1, &ADC_InitStructure);//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器







  •     // 配置ADC 通道的转换顺序和采样时间



  •     ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5);



  •     ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_239Cycles5);



  •     ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_239Cycles5);



  •     ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 4, ADC_SampleTime_239Cycles5);



  •     ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 5, ADC_SampleTime_239Cycles5);



  •     ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 6, ADC_SampleTime_239Cycles5);











  •     ADC_Cmd(ADC1, ENABLE);//使能指定的ADC1



  •     ADC_DMACmd(ADC1, ENABLE);//使能ADC DMA 请求







  •     ADC_ResetCalibration(ADC1);    //使能复位校准  



  •     while(ADC_GetResetCalibrationStatus(ADC1));    //等待复位校准结束







  •     ADC_StartCalibration(ADC1);     //开启AD校准



  •     while(ADC_GetCalibrationStatus(ADC1));     //等待校准结束







  •     ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使用软件触发ADC转换



  • }






给一个电位器两端接的3.3V和GND,用万用表测量中间电位0.9V,把通道一接在电位器中间那个脚上
用串口把结果打印在电脑上明显不对

这是main里面循环打印的代码;

  •   while(1)



  •     {



  •         for(i=0;i<=5;i++){



  •             voltage = (float)(adc_original_data*(3.3/4096));



  •             printf("通道%d的值 = %f \r\n",i+1,voltage);



  •         }



  •         printf("\r\n");



  •         printf("\r\n");



  •         printf("\r\n");



  •         delay_ms(10);



ALIENTEK MINISTM32串口_adc_try 2.0.zip

2.99 MB, 下载次数: 2

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2023-7-14 00:50:58 | 显示全部楼层
下载我们最新例程,有这种DMA+ADC+多通道的参考了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

31

主题

1951

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4418
金钱
4418
注册时间
2018-5-11
在线时间
923 小时
发表于 2023-7-14 23:04:52 | 显示全部楼层
你不触发ADC转换,
怎么会有转换值呢。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 04:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表