OpenEdv-开源电子网

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

关于多路复用开关+ADC+串口的传输速度问题

[复制链接]

25

主题

103

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2018-3-10
在线时间
66 小时
发表于 2019-9-2 11:09:31 | 显示全部楼层 |阅读模式
10金钱
本人有一个项目需要用到两个16路开关对传感器进行扫描,需要用到ADC然后通过串口发送。结果发现传送速度真的很慢,而且已经开启了DMA。求问大佬怎样才能提高传输速度
  1. #include "adc.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "high.h"
  5. #include "DMA.h"

  6. extern __IO uint16_t ADC_ConvertedValue;
  7. u8 FSR_BUF[514];
  8.        
  9. // void control()
  10. // {
  11. //  vcc1_en=0;
  12. //        gnd1_en=0;  
  13. // }         

  14. int channel[16][4]=
  15. {
  16.   {0,0,0,0},//channel 0
  17.   {1,0,0,0},//channel 1
  18.         {0,1,0,0},//channel 2
  19.         {1,1,0,0},//channel 3
  20.         {0,0,1,0},//channel 4
  21.         {1,0,1,0},//channel 5
  22.         {0,1,1,0},//channel 6
  23.         {1,1,1,0},//channel 7
  24.         {0,0,0,1},//channel 8
  25.         {1,0,0,1},//channel 9
  26.         {0,1,0,1},//channel 10
  27.         {1,1,0,1},//channel 11
  28.         {0,0,1,1},//channel 12
  29.         {1,0,1,1},//channel 13
  30.         {0,1,1,1},//channel 14
  31.         {1,1,1,1} //channel 15
  32. };

  33.   void getadc()
  34. {
  35.     volatile int k=1;
  36.           volatile int i,j,a,p,m;
  37.           float temp;

  38.          
  39.     FSR_BUF[0]=238;
  40.           FSR_BUF[513]=255;
  41.          
  42.                  vcc1_en=0;
  43.                 gnd1_en=0;          
  44.                 vcc2_en=1;
  45.                 gnd2_en=1;

  46.          for(i=0;i<16;i++)
  47.                 {         
  48.                          vcc1_s0=channel[i][0];
  49.              vcc1_s1=channel[i][1];
  50.              vcc1_s2=channel[i][2];
  51.              vcc1_s3=channel[i][3];

  52.                          for(j=0;j<16;j++)
  53.        {                 
  54.                          gnd1_s0=channel[j][0];
  55.              gnd1_s1=channel[j][1];
  56.        gnd1_s2=channel[j][2];
  57.        gnd1_s3=channel[j][3];
  58.                          delay_ms(1);
  59.                          temp=(float) ADC_ConvertedValue*(3.3/4096);
  60.        p=-7.89551702691597*temp*temp*temp*temp*temp+84.1041604009715*temp*temp*temp*temp-378.645330958236*temp*temp*temp+937.394903665604*temp*temp-1350.80007444151 *temp+956.225199319509;
  61.                          if (p>250||p<=0)
  62.                           {
  63.                                         p=0;
  64.                                 }                       
  65.                    FSR_BUF[k]=p;
  66.                                 k++;

  67.        }
  68.                  }
  69.                
  70.                 vcc1_en=1;
  71.                 gnd1_en=1;          
  72.                 vcc2_en=0;
  73.                 gnd2_en=0;

  74.                  for(i=0;i<16;i++)
  75.                 {         
  76.                          vcc2_s0=channel[i][0];
  77.              vcc2_s1=channel[i][1];
  78.              vcc2_s2=channel[i][2];
  79.              vcc2_s3=channel[i][3];
  80.                        
  81.                          for(j=0;j<16;j++)
  82.        {                 
  83.                          gnd2_s0=channel[j][0];
  84.              gnd2_s1=channel[j][1];
  85.        gnd2_s2=channel[j][2];
  86.        gnd2_s3=channel[j][3];
  87.                          delay_ms(1);
  88.                          temp=(float) ADC_ConvertedValue*(3.3/4096);
  89.        p=-7.89551702691597*temp*temp*temp*temp*temp+84.1041604009715*temp*temp*temp*temp-378.645330958236*temp*temp*temp+937.394903665604*temp*temp-1350.80007444151 *temp+956.225199319509;
  90.                          if (p>250||p<=0)
  91.                           {
  92.                                         p=0;
  93.                                 }                       
  94.                                
  95.                          FSR_BUF[k]=p;
  96.                          k++;

  97.        }
  98.                  }
  99.                
  100.                
  101.                 USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);
  102.                 MYDMA_Enable(DMA1_Channel4);

  103. }


  104.        
  105.         int main(void)
  106.         {
  107.          delay_init();         
  108.    //delay_ms(1);                //延时函数初始化          
  109.          uart_init(9600);                 //串口初始化为9600
  110.          ADC1_Init();                          //ADC初始化          
  111.          HIGH_Init();
  112.          //control();
  113.          MYDMA_Config(DMA1_Channel4,(u32)&USART1->DR,(u32)FSR_BUF,514);//DMA1通道4,外设为串口1,存储器为SendBuff,长(TEXT_LENTH+2)*100.

  114.          while(1)
  115.          {
  116.                  getadc();
  117.                 delay_ms(4);                                                                    
  118.   }       
  119. }
复制代码


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

使用道具 举报

25

主题

103

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2018-3-10
在线时间
66 小时
 楼主| 发表于 2019-9-2 11:10:59 | 显示全部楼层
附上ADC的采样时间
  1. __IO uint16_t ADC_ConvertedValue;

  2. void ADC1_Init(void)
  3. {
  4.         ADC1_GPIO_Config();     //下面有详细的代码配置
  5.         ADC1_Mode_Config();
  6. }

  7. static void ADC1_GPIO_Config(void)
  8. {
  9. GPIO_InitTypeDef GPIO_InitStructure;    //定义写入寄存器的结构体
  10. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  //使能时钟,注意使能的是DMA1
  11. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE); //本实验使用的是GPIOC1,使能ADC1,GPIO时钟
  12. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;  //配置为PC.1   
  13. GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AIN;  //设置为模拟输入
  14. GPIO_Init(GPIOA, &GPIO_InitStructure);    // 初始化写入寄存器中
  15. }

  16. static void ADC1_Mode_Config(void)
  17. {
  18. DMA_InitTypeDef DMA_InitStructure;   //定义写入DMA寄存器的结构体
  19. ADC_InitTypeDef ADC_InitStructure;   //定义写入ADC寄存器的结构体
  20. DMA_DeInit(DMA1_Channel1);  //复位初始化,配置为复位模式,下面我们再重新配置(不知道有用没)
  21. DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR;   //设置源地址
  22. DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; //设置内存地址
  23. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  // 设置传输方向
  24. DMA_InitStructure.DMA_BufferSize = 1;    //因为我们最后一直改变一个变量,所以只有一位
  25. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址固定
  26. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;      //内存地址固定
  27. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //外设传输数据大小为半字
  28. DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;   //内存传输数据大小为半字
  29. DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;          //循环模式
  30. DMA_InitStructure.DMA_Priority = DMA_Priority_High;    //高优先级
  31. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;     //禁止内存间传输数据
  32. DMA_Init(DMA1_Channel1, &DMA_InitStructure);    //将结构体写入寄存器中

  33. DMA_Cmd(DMA1_Channel1, ENABLE);    //使能DMA寄存器的1通道

  34. /* ADC1 configuration */
  35. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;   //因为只有一个通道,所以为独立ADC模式
  36. ADC_InitStructure.ADC_ScanConvMode = DISABLE ;       //一个通道,所以不使能扫描模式
  37. ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;   //开启连续转换,就是不停转换
  38. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不使用外部触发,外部触发只有几个固定引脚,详情看手册
  39. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  //我们定义16位数,采集12位,所以要定义对齐方向,在这我们采取右对齐
  40. ADC_InitStructure.ADC_NbrOfChannel = 1;          //要转换的通道数目
  41. ADC_Init(ADC1, &ADC_InitStructure);          ////将结构体写入寄存器中

  42. RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //72M时钟8分频为9M PS:ADC最大时钟速率为14M,后面解释

  43. //ADC_DeInit(ADC1);

  44. ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);  //初始化,采样时间为55.5us,采样序号是1,PS:采样时间最                                                                         // 为1.5us,转换时间为固定12.5us,所以相当于采集完一次数为14us
  45. ADC_DMACmd(ADC1, ENABLE);   //  使能DMA1
  46. ADC_Cmd(ADC1, ENABLE);   //使能ADC1
  47. ADC_ResetCalibration(ADC1);   //复位校准寄存器
  48. while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准寄存器完成
  49. ADC_StartCalibration(ADC1);   //ADC校准
  50. while(ADC_GetCalibrationStatus(ADC1));  //等待校准完成
  51. ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1的软件触发
  52. }
复制代码
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10571
金钱
10571
注册时间
2017-2-18
在线时间
1914 小时
发表于 2019-9-2 12:43:38 | 显示全部楼层
帮顶~~
回复

使用道具 举报

25

主题

103

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2018-3-10
在线时间
66 小时
 楼主| 发表于 2019-9-3 19:35:11 | 显示全部楼层
有人帮忙嘛
回复

使用道具 举报

0

主题

79

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1926
金钱
1926
注册时间
2018-10-11
在线时间
255 小时
发表于 2019-9-4 08:28:48 | 显示全部楼层
看着你那长长的带那么多位小数的算式,别说单片机了,我算出来估计都要好长时间...
用9600波特率当然慢,加快点试试,上个1M~2M
回复

使用道具 举报

25

主题

103

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2018-3-10
在线时间
66 小时
 楼主| 发表于 2019-9-12 14:47:38 | 显示全部楼层
spritels 发表于 2019-9-4 08:28
看着你那长长的带那么多位小数的算式,别说单片机了,我算出来估计都要好长时间...
用9600波特率当然慢, ...

这个跟那个算式没关系吧
回复

使用道具 举报

25

主题

103

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2018-3-10
在线时间
66 小时
 楼主| 发表于 2019-9-17 16:53:31 | 显示全部楼层
有人吗
回复

使用道具 举报

10

主题

293

帖子

0

精华

高级会员

Rank: 4

积分
623
金钱
623
注册时间
2019-6-3
在线时间
107 小时
发表于 2019-9-18 14:17:16 | 显示全部楼层
代码好长,帮顶
回复

使用道具 举报

5

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2014-8-7
在线时间
59 小时
发表于 2019-9-18 22:19:58 | 显示全部楼层
看到你代码里面有延时,会不会是这个造成你的慢。或者到底是多慢,你也没说出来
回复

使用道具 举报

25

主题

103

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2018-3-10
在线时间
66 小时
 楼主| 发表于 2019-9-20 21:14:44 | 显示全部楼层
ndthome 发表于 2019-9-18 22:19
看到你代码里面有延时,会不会是这个造成你的慢。或者到底是多慢,你也没说出来

的确是这几个延迟将采集速度变慢的。可是试过几次将延迟变小,那样的话返回的数据就不完整了
回复

使用道具 举报

25

主题

103

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2018-3-10
在线时间
66 小时
 楼主| 发表于 2019-9-21 15:28:53 | 显示全部楼层
ndthome 发表于 2019-9-18 22:19
看到你代码里面有延时,会不会是这个造成你的慢。或者到底是多慢,你也没说出来

确实是延迟造成的问题,可是若将延迟降低,那我采集的数据则不完整
回复

使用道具 举报

5

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2014-8-7
在线时间
59 小时
发表于 2019-9-26 22:26:23 | 显示全部楼层
为什么不加延时就会采集数据不完整?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 18:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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