• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

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

lixiang 2019-10-08 浏览量:746
本人有一个项目需要用到两个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.   {0000}//channel 0
  17.   {1000}//channel 1
  18.         {0100}//channel 2
  19.         {1100}//channel 3
  20.         {0010}//channel 4
  21.         {1010}//channel 5
  22.         {0110}//channel 6
  23.         {1110}//channel 7
  24.         {0001}//channel 8
  25.         {1001}//channel 9
  26.         {0101}//channel 10
  27.         {1101}//channel 11
  28.         {0011}//channel 12
  29.         {1011}//channel 13
  30.         {0111}//channel 14
  31.         {1111} //channel 15
  32. };

  33.   void getadc()
  34. {
  35.     volatile int k=1;
  36.           volatile int ijapm;
  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(USART1USART_DMAReq_TxENABLE);
  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_BUF514);//DMA1通道4外设为串口1存储器为SendBuff长(TEXT_LENTH+2)*100.

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

m data-ke-onclick="copycode($('code_mDo'));">复制代码


0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
所有亮答 数量:1
  • 16通道数据用串口发送感觉瓶颈在串口波特率上

    这样算吧波特率9600最多也就每秒能发1000字节多点数据

    你先看看这个数据量能否把16通道数据发送完.

    你可以考虑用更高串口波特率另外减少数据量比如降低采样速率

相关问题

问题达人换一批

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