OpenEdv-开源电子网

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

2路ADC+DMA实在是解决不了了 求各位大神看看 给指点迷津

[复制链接]

16

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
201
金钱
201
注册时间
2014-9-23
在线时间
15 小时
发表于 2014-11-19 20:56:31 | 显示全部楼层 |阅读模式
5金钱
论坛也看过几个列子 ,根据自己理解的写的  求看看哪里出问题了,2路电压输出0!给的是3.3v
[mw_shl_code=c,true]//采集ADC1 通道1,2的电压值 #include "AD.h" #include "delay.h" void ADC_Init(void) { RCC->APB2ENR|=1<<2; //使能PA外设时钟 GPIOA->CRL&=0xFFFFFF0F; //PA1清零 GPIOA->CRL|=0x00000000; //模拟输入 GPIOA->CRL&=0xFFFFF0FF; //PA2清零 GPIOA->CRL|=0x00000000; //模拟输入 RCC->APB2ENR|=1<<9; //ad外设时钟使能 RCC->APB2RSTR|=1<<9; //adc1 复位 RCC->APB2RSTR&=~(1<<9); //adc1 复位结束 RCC->CFGR&=~(3<<14); //预分频因子清零 RCC->CFGR|=2<<14; //六分频 12MHz ADC1->CR1&=~(1<<8); //扫描方式清零 ADC1->CR1|=1<<8; //扫描方式 ADC1->CR1&=0xF0FFFF; //工作模式清零 ADC1->CR1|=0<<16; //独立工作模式 ADC1->CR2|=1<<8; //允许dma访问 ADC1->CR2&=~(1<<1); //单次转换模式清零 ADC1->CR2|=1<<1; //连续转换 ADC1->CR2&=~(7<<17); //启动规则转换清零 ADC1->CR2|=7<<17; //软件触发 ADC1->CR2|=~(1<<11); //右对齐 ADC1->SQR1&=~(0xF<<20); //通道数清零 ADC1->SQR1|=1<<20; //2个转换 ADC1->SMPR2&=~(7<<3); //采样时间清零 ADC1->SMPR2|=7<<3; //采样时间为239.5个周期,即ADC的转换时间T=239.5+12.5=252; ADC1->CR2|=1<<0; //开启AD // ADC1->CR2&=~(1<<3); //adc复位校准清零 ADC1->CR2|=1<<3; //开启复位校准 while(ADC1->CR2&1<<3); //等待复位校准结束 // ADC1->CR2&=~(1<<2); //ad校准清零 ADC1->CR2|=1<<2; //开启AD校准 while(ADC1->CR2&1<<2); //等待AD校准结束 } u16 get_ad(u8 ch) //获取ADC->DR的数据 { ADC1->SQR3&=0xFFFFFC00; //通道清零 ADC1->SQR3|=ch; //第ch个通道 ADC1->CR2|=1<<22; //规则通道启动(每次转换都要写1) while(!(ADC1->SR&1<<1)); //等待ad转换结束,硬件置1 return ADC1->DR; //读取数据 } u16 average_ad(u8 ch,u8 times) { u32 average_ad=0; u8 t; for(t=0;t<times;t++) { average_ad=average_ad+get_ad(ch); delay_ms(5); } return average_ad/times; } [/mw_shl_code]
[mw_shl_code=c,true]#include "DMA.h" #include "delay.h" u16 DMA1_MEM_LEN;//保存DMA每次数据传送的长度 //DMA1的各通道配置 //这里的传输形式是固定的,这点要根据不同的情况来修改 //从存储器->外设模式/8位数据宽度/存储器增量模式 //DMA_CHxMA通道CHx //cpar:外设地址 //cmar:存储器地址 //cndtr:数据传输量 void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr) { RCC->AHBENR|=1<<0; //开启DMA1时钟 delay_ms(5); //等待DMA时钟稳定 DMA_CHx->CPAR=cpar; //DMA1 外设地址 DMA_CHx->CMAR=(u32)cmar; //DMA1,存储器地址 DMA1_MEM_LEN=cndtr; //保存DMA传输数据量 DMA_CHx->CNDTR=cndtr; //DMA1,传输数据量 DMA_CHx->CCR=0X00000000; //复位 DMA_CHx->CCR|=1<<4; //从存储器读 DMA_CHx->CCR|=0<<5; //普通模式 DMA_CHx->CCR|=0<<6; //外设地址非增量模式 DMA_CHx->CCR|=1<<7; //存储器增量模式 DMA_CHx->CCR|=1<<8; //外设数据宽度为16位 DMA_CHx->CCR|=1<<10; //存储器数据宽度16位 DMA_CHx->CCR|=1<<12; //中等优先级 DMA_CHx->CCR|=0<<14; //非存储器到存储器模式 } //开启一次DMA传输 void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx) { DMA_CHx->CCR&=~(1<<0); //关闭DMA传输 DMA_CHx->CNDTR=DMA1_MEM_LEN; //DMA1,传输数据量 DMA_CHx->CCR|=1<<0; //开启DMA传输 } [/mw_shl_code]

[mw_shl_code=c,true]#include <sys.h> #include <usart.h> #include <delay.h> #include <LED.h> #include <AD.h> #include <lcd.h> #include <DMA.h> #include <TIMER.h> float temp,temp1,temp2,temp3; u16 SendBuff[2]; int main(void) { u16 adcx1,adcx2; Stm32_Clock_Init(9); //set system clock uart_init(72,9600); delay_init(72); //delay init LED_Init(); LCD_Init(); // TIM3_Init(29999,7199); //3秒定时 ADC_Init(); MYDMA_Config(DMA1_Channel1,(u32)&ADC1->DR,(u32)SendBuff,2); //DMA1 配置 MYDMA_Enable(DMA1_Channel1); //开启DMA POINT_COLOR=BLUE; //字体设置成蓝色 LCD_ShowString(60,130,200,16,16,"adcx1:"); LCD_ShowString(60,150,200,16,16,"adcx2:"); LCD_ShowString(60,170,200,16,16,"average_ad1:0.000V"); LCD_ShowString(60,190,200,16,16,"average_ad2:0.000V"); while(1) { average_ad(ADC_CH1,15); // 获取均值 average_ad(ADC_CH2,15); // adcx1=average_ad(ADC_CH1,15); // adcx2=average_ad(ADC_CH2,30); if(DMA1->ISR&(1<<1))//等待通道1传输完成 { DMA1->IFCR|=1<<1; //清除传输完成标志 } adcx1=SendBuff[0]; adcx2=SendBuff[1]; LCD_ShowxNum(108,130,adcx1,4,16,0); //显示ad1的值 LCD_ShowxNum(108,150,adcx2,4,16,0); //显示ad2的值 temp=(float)adcx1*(3.3/4096); //实际通道1电压值 temp2=(float)adcx2*(3.3/4096); //实际通道2电压值 temp1=temp; adcx1=temp; temp3=temp2; adcx2=temp2; LCD_ShowxNum(156,170,adcx1,1,16,0); //显示电压值 LCD_ShowxNum(156,190,adcx2,1,16,0); //显示电压值 temp=temp-adcx1; adcx1=temp*1000; temp3=temp2-adcx2; adcx2=temp3*1000; LCD_ShowxNum(172,170,adcx1,3,16,0x80); //显示完全 LCD_ShowxNum(172,190,adcx2,3,16,0x80); //显示完全 LED0=!LED0; delay_ms(250); } } [/mw_shl_code]



 


























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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-20 00:03:08 | 显示全部楼层
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2014-10-21
在线时间
1 小时
发表于 2014-11-28 22:58:30 | 显示全部楼层
DMA_CHx->CCR|=1<<4;        //从存储器读
这一句要改为DMA_CHx->CCR|=0<<4;        //从外设读
不过改完之后,我在运行的时候发现输出一直未3.30V,不管输入为多大的电压
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 17:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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