OpenEdv-开源电子网

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

用7路AD通道采集外部7路电压信号

[复制链接]

9

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2012-7-29
在线时间
17 小时
发表于 2012-9-10 09:09:04 | 显示全部楼层 |阅读模式
 原子哥,我现在用7路AD通道采集外部7路电压信号,并且将这7路信号实时上传到上位机软件进行查看,这一过程也基本实现了,但上传到上位机观看时数据传输还有些问题,原子哥有没有相关的例程参考下,谢谢了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-9-10 09:57:07 | 显示全部楼层
用什么传的?串口?有什么问题?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2012-7-29
在线时间
17 小时
 楼主| 发表于 2012-9-10 11:23:49 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我是通过AD--(DMA)--(AD-buffer)---(DMA)--TR-buffer(串口),我是通过这一过程传输的,其中AD采集是通过定时器触发,七路通道采集完了就开启AD-buffer与TR-buffer的DMA通道(这一过程我是在AD的DMA请求里完成),并且七个通道的数据是通过对他的高四位进行编号区分的,现在就是传到上位机的数据感觉丢了很多,导致波形失真
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-9-10 14:14:03 | 显示全部楼层
先试试不用DMA的。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

15

主题

138

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2012-8-10
在线时间
2 小时
发表于 2012-9-12 09:05:41 | 显示全部楼层
我来解决吧
u16 Receive[3];//你可以改成7,因为你要7路采集
dma_init(DMA1_Channel1,(u32)&Receive,(u32)&ADC1->DR,sizeof(Receive)); //调用下面的函数
void dma_init(DMA_Channel_TypeDef*dma_number,u32 masteraddr,u32 slaveaddr,u16 number)
  {
 //u32 p;
//p=slaveaddr;
m=number;
RCC->AHBENR|=1<<0;//打开dma时钟
delay_us(5);
dma_number->CCR|=0<<4; //从外设读取数据
dma_number->CMAR=(u32)masteraddr; //存储器地址
dma_number->CPAR=(u32)slaveaddr; //做缓冲使用,外设地址
dma_number->CNDTR=number;//代表dma通道传数输据的个数
dma_number->CCR|=1<<7;//存储器地址增量模式,因为只有为增量,才能够使得每次
//dma_number->CCR|=1<<6;//从存储器读取数据的时,地址指针可自动加1
dma_number->CCR|=1<<8;//外设数据宽度为16位
dma_number->CCR|=1<<10;//存储器数据宽度为16位
dma_number->CCR|=2<<12;//dma优先级高
dma_number->CCR|=1<<5; //执行循环模式(CMAR和CPAR也重新赋初值)
dma_number->CCR|=(1<<0); //开启dma传输
  }



最关键的地方
  void adc_init()
 {  
  RCC->APB2ENR|=1<<2|1<<9; //开启PA时钟 ,以及ADC时钟
  RCC->APB2RSTR|=1<<9;//复位adc1
  RCC->APB2RSTR&=~(1<<9);//复位完成,需要将复位关闭,否则将一直保持复位     
  RCC->CFGR|=1<<15;//设置为6分频给ADC转换时钟  //读取ADC0的值
  GPIOA->ODR=1<<0|1<<1;//设置PA0口为模拟上拉输入,PA1口模拟上拉输入
  ADC1->CR2|=1<<20;//允许软件外部触发  
  ADC1->CR2|=1<<19|1<<18|1<<17;//选择为软件触发
  ADC1->SMPR1=0X1c0000; //为了提高精度,1通道以及16通道
  ADC1->SMPR2=0X3f; //通道0,1采样间隔为最大
  ADC1->CR2|=1<<23;//开启内部温度传感器
  ADC1->CR2|=1<<0;//开启转换
  ADC1->CR1|=1<<8;//开启扫描模式
  ADC1->CR2|=1<<3;//初始化复位校准寄存器 
   ADC1->CR2|=1<<8;//允许dma访问
  while(ADC1->CR2&1<<3);  //等待校准结束   
  ADC1->CR2|=1<<2;//开始校准
  while(ADC1->CR2&1<<2);  //等待校准结束 
  //ADC1->CR1|=1<<5;//允许中断
  ADC1->CR2|=1<<1;//设置为连续模式
  ADC1->SQR1|=2<<20;//开启三个转换
  ADC1->CR2|=1<<22;//开始规则转换
  // MY_NVIC_Init(2,1,ADC1_2_IRQChannel,2);//设置中断优先级
  ADC1->SQR3=0|(16<<5)|(1<<10);  //这个表明在第一规则通道当中,进行转换的将是16通道的数据
  //通道0,1以及通道16转换  (转换顺序是通道0,通道16,通道1)  你这里应该要设7个,对于ADC->SQRx你能真正理解了吗??不然你还是不会

}



好了,有什么问题在咨询我吧 qq:741569205
学海无涯,回头是岸
回复 支持 反对

使用道具 举报

9

主题

66

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2013-3-16
在线时间
0 小时
发表于 2013-7-29 19:45:23 | 显示全部楼层
mark                                  ,,
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-16 04:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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