本帖最后由 zhjb1 于 2024-11-21 16:36 编辑
接受意见修改一下。一、本实验:用AWB设置的工程,ADC1,5路采样,12位右对齐,DMA方式,缓冲。生成代码后ADC1的5路结果绑定在DMA2的4通道上,在中断服务中是DMA2的4_5:void DMA2_Channel4_5_IRQHandler(void)。ADC1采用5路采样IN1,IN2,IN3,IN6,IN7。IN7 采样芯片温度;我设置的采样结果赋值给数组adcx[5],这个数组将结果输出到LCD供显示用。
二、采用本网站的实例,此实例的定义如下:
#define Channel_num 4
#define ADC1_BUffer_Size 64
#define DMA_buffer_size (Channel_num*ADC1_BUffer_Size)
uint16_t ADC1_Buffer[ADC1_BUffer_Size][Channel_num] = {0};
定义的DMA缓冲大小是256(64x4):dma_data_number_set(DMA1_CHANNEL1,256);
可以得到数组为ADC1_Buffer[64][4];——实例4路采样4个通道,我的是5路,改成ADC1_Buffer[x][5];其中的x想在实验中取得,因为实例程序代码中x是index从0->5来填充,我想够用即可。
我也采用这么的大小的缓冲区定义为:dma_data_number_set(DMA2_CHANNEL4,256);
实验结果x无论采用多大的数值(实验中x采用过5、16、24、32、50),其结果都不对!能看到采样的5路数据,但显示出来的结果除了有限的5个数据,还有个别的不知什么数据,并且他们没有规律的显示在不同顺序上,参看下图上位机模拟串口打印的结果。如果50再大就超出256了。
问题:
1. 当采用5 路12位右对齐方式的数据,DMA2_4的缓冲应该多大?我实验时将ADC1_Buffer[x][5];x取值5、16,24、32,50;等等结果一致好像与缓冲大小无关。
应该取多少?
2. 实力的方法可以的到数据,但数据读出的顺序没有规律,就是说我将读出的数据打印出同时顺序赋值给adcx[];但显示和打印的结果有点随机性无规率,下图可以参考。赋值方法为:index是从0->5。
adcx[0]=ADC1_Buffer[index][0];adcx[1]=ADC1_Buffer[index][1];...adcx[4]=ADC1_Buffer[index][4];
应该如何获得正确的数值呢?
3. 上赋值时for(index=0;index<5;index++)的循环,分别赋值了5次,结果应该是最后一次读的。我就直接进行如下测试,index固定从0->4赋值给adcx[],不循环了,就像如下:
adcx[0]=ADC1_Buffer[index][0]; adcx[2]=ADC1_Buffer[index+1][1];... ; adcx[4]=ADC1_Buffer[index+4][4];
以及
adcx[0]=ADC1_Buffer[index][0]; adcx[1]=ADC1_Buffer[index+1][0]; adcx[2]=ADC1_Buffer[index+4][0]; adcx[3]=ADC1_Buffer[index+4][0]; adcx[4]=ADC1_Buffer[index+4][0];
以及
adcx[1]=ADC1_Buffer[index+4][x]; x从0->4的循环
结果有时没有数据,有数据时,整体上得到的采样结果还是顺序乱蹦。
哪里出问题了呢?
这是ADC采样的问题。最后:
4. 当配置出DMA2_4_5中断服务之后,下载代码,TFTLCD只是刚开机可以显示,马上就黑了!这是第三个大问题,这个问题会有头绪的,将来重新划分地址应该能解决。这样就去掉了彩色LCD,只留黑白的。
5. 问题是AT_LINK下载程序后单片机不能自动运行了,必须拔掉AD_LINK再重新插上才运行。keil项目设置中run的勾一定会打上的。
首先关心的时ADC采样能正常!如果数据正常了,其它问题可以慢慢解决,毕竟不是硬件问题。
以上希望工程师,老师们部门看看提出意见,先谢谢了。顺便说一下,参考过官网的实例,本站:楼主:我想看大海、、楼主:可怜的小弗朗仕、、楼主:tpgf、等等,大约翻到超过44页。在此一并表示感谢
|