数码之家

 找回密码
 立即注册
搜索
查看: 1988|回复: 3

[Arduino] 请教cs1238通道切换,要100ms

[复制链接]
发表于 2022-8-23 12:27:55 | 显示全部楼层 |阅读模式
1个通道切换读取要花100ms,2个通道要200ms多,太慢了
  1. #include <Arduino.h>
  2. #include "coda_cs1237.h"
  3. coda_cs1237 cs1237;

  4. void setup() {
  5.   Serial.begin(115200);
  6.   cs1237.begin(27, 26);
  7.   //cs1237.config(SPEED_40Hz,CH_A,GAIN_1X);
  8.   //Serial.println(cs1237.Read_Config());
  9. }

  10. int32_t data, data2;
  11. unsigned long
  12.   loopTimeStart = 0,                                    //SYSTEM PARAMETER - 用于循环循环秒表,记录循环开始时间
  13.   loopTimeEnd = 0;                                      //SYSTEM PARAMETER - 用于循环循环秒表,记录循环结束时间
  14. float loopTime = 0.0000;                                // SYSTEM PARAMETER -

  15. void loop() {
  16.    //////////// LOOP TIME STOPWATCH ////////////
  17.   loopTimeStart = micros();                             //Record Start Time
  18.   loopTime = (loopTimeStart - loopTimeEnd) / 1000.000;  //Compute Loop Cycle Speed (mS)
  19.   loopTimeEnd = micros();                               //Record End Time
  20.   cs1237.config(SPEED_40Hz, CH_A, GAIN_1X);
  21.   //delay(10);
  22.   Serial.print("CH_A\t");
  23.   data = cs1237.read();
  24.   Serial.print(data, HEX);
  25.   Serial.print("\t");
  26.   Serial.print(data);
  27.   Serial.print("\t");
  28.   float vo = (float)data * 3.32f / 0x800000 / 2;
  29.   float Io = vo / (0.01 * 25);
  30.   Serial.print(vo);
  31.   Serial.print("\t");
  32.   Serial.println(Io);

  33.   cs1237.config(SPEED_40Hz, CH_B, GAIN_1X);
  34.   delay(10);
  35.   Serial.print("CH_B\t");
  36.   data2 = cs1237.read();
  37.   Serial.print(data2, HEX);
  38.   Serial.print("\t");
  39.   Serial.print(data2);
  40.   Serial.print("\t");
  41.   float vo2 = (float)data2 * 3.32f / 0x800000 / 2;
  42.   float Io2 = vo2 / (0.01 * 25);
  43.   Serial.print(vo2);
  44.   Serial.print("\t");
  45.   Serial.print(Io2);
  46.   Serial.print("\t");

  47.   Serial.println(loopTime);
  48. }
复制代码


coda_cs1237.h
  1. #ifndef CS1237SUPPORT_CODA_CS1237_H
  2. #define CS1237SUPPORT_CODA_CS1237_H
  3. #include <Arduino.h>

  4. #define SPEED_10Hz      0b00
  5. #define SPEED_40Hz      0b01
  6. #define SPEED_640Hz     0b10
  7. #define SPEED_1280Hz    0b11

  8. #define GAIN_1X         0b00
  9. #define GAIN_2X         0b01
  10. #define GAIN_64X        0b10
  11. #define GAIN_128X       0b11

  12. #define CH_A            0b00
  13. #define CH_B            0b01
  14. #define CH_TEMP         0b10
  15. #define CH_SC           0b11

  16. #define REF_OUT_ON      0b0
  17. #define REF_OUT_OFF     0b1

  18. #define PIN_IN()      pinMode(DIO,INPUT);
  19. #define PIN_OUT()     pinMode(DIO,OUTPUT);
  20. #define D_HIGH()      digitalWrite(DIO,HIGH);
  21. #define D_LOW()       digitalWrite(DIO,LOW);

  22. #define C_HIGH()      digitalWrite(CLK,HIGH);
  23. #define C_LOW()       digitalWrite(CLK,LOW);

  24. #define D_IN()        digitalRead(DIO)


  25. #define delay_ms(ms)    delay(ms);
  26. #define delay_us(us)    delayMicroseconds(us);

  27. #define GEN_CLK()       C_HIGH();delay_us(1);D_HIGH();C_LOW();delay_us(1);

  28. class coda_cs1237
  29. {
  30. private:
  31.     uint8_t DIO=0;
  32.     uint8_t CLK=1;
  33. public:
  34.     void begin(uint8_t dio=0,uint8_t clk=1);
  35.     void setpin(uint8_t dio=0,uint8_t clk=1);
  36.     void config(uint8_t speed = SPEED_40Hz  ,       //设置采样率
  37.                 uint8_t channel= CH_A       ,       //采样通道
  38.                 uint8_t gain = GAIN_1X      ,       //
  39.                 uint8_t refout =REF_OUT_ON          //
  40.                 );
  41.     unsigned char Read_Config(void);
  42.     uint8_t config(void);
  43.     int32_t read(void);
  44. };

  45. #endif //CS1237SUPPORT_CODA_CS1237_H
复制代码


coda_cs1237.cpp
  1. #include "coda_cs1237.h"


  2. void coda_cs1237::begin(uint8_t dio,uint8_t clk)
  3. {
  4.     DIO=dio;
  5.     CLK=clk;
  6.     pinMode(DIO,OUTPUT);
  7.     pinMode(CLK,OUTPUT);
  8. }

  9. void coda_cs1237::setpin(uint8_t dio, uint8_t clk)
  10. {
  11.     DIO=dio;
  12.     CLK=clk;
  13. }

  14. void coda_cs1237::config(uint8_t speed   ,       //设置采样率
  15.                          uint8_t channel ,       //采样通道
  16.                          uint8_t gain    ,       //
  17.                          uint8_t refout
  18.                          )
  19. {
  20.     uint8_t i;
  21.     uint8_t dat;
  22.     uint16_t count_i = 0;
  23.     dat =(refout<< 6) | (speed << 4) | (gain<<2) | (channel);
  24.     PIN_OUT()
  25.     D_HIGH();
  26.     PIN_IN();
  27.     C_LOW();
  28.     while (D_IN()==1)
  29.     {
  30.         delay_ms(1);
  31.         count_i++;
  32.         if(count_i>300)
  33.         {
  34.             PIN_OUT();
  35.             //D_HIGH();
  36.             C_HIGH();
  37.             return;
  38.         }
  39.     }
  40.     for(i=0;i<29;i++)
  41.     {
  42.         C_HIGH();
  43.         delay_us(1);
  44.         C_LOW();
  45.         delay_us(1);
  46.     }
  47.     PIN_OUT();

  48.         C_HIGH();delay_us(1);D_HIGH();C_LOW();delay_us(1);//30
  49.         C_HIGH();delay_us(1);D_HIGH();C_LOW();delay_us(1);//31
  50.     C_HIGH();delay_us(1);D_LOW();C_LOW();delay_us(1);//32
  51.     C_HIGH();delay_us(1);D_LOW();C_LOW();delay_us(1);//33
  52.     C_HIGH();delay_us(1);D_HIGH();C_LOW();delay_us(1);//34
  53.     C_HIGH();delay_us(1);D_LOW();C_LOW();delay_us(1);//35
  54.     C_HIGH();delay_us(1);D_HIGH();C_LOW();delay_us(1);//36

  55.     C_HIGH();delay_us(1);C_LOW();delay_us(1);    //37  写入了0x65
  56.         
  57.     for(i=0;i<8;i++)                            // 38 - 45个脉冲了,写8位数据
  58.     {
  59.         C_HIGH();                                    // CLK=1;
  60.         delay_us(1);
  61.         if(dat&0x80)
  62.         {
  63.             D_HIGH();                           // OUT = 1
  64.         }
  65.         else
  66.         {
  67.             D_LOW();
  68.         }
  69.         dat <<= 1;
  70.         C_LOW();                                    // CLK=0;
  71.         delay_us(1);
  72.     }
  73.     D_HIGH();                                   // OUT = 1
  74.     C_HIGH();                                        // CLK=1;
  75.     delay_us(1);
  76.     C_LOW();                                        // CLK=0;
  77.     delay_us(1);
  78. }


  79. // 读取芯片的配置数据
  80. unsigned char coda_cs1237::Read_Config(void)
  81. {
  82.     unsigned char i;
  83.     unsigned char dat = 0; //读取到的数据
  84.     unsigned int count_i = 0; //溢出计时器
  85.         
  86.     PIN_OUT();
  87.     //D_HIGH();
  88.         
  89.         PIN_IN();
  90.     C_LOW();//时钟拉低
  91.     while(D_IN() == 1) { //等待芯片准备好数据
  92.         delay_ms(1);
  93.         count_i++;
  94.         if(count_i > 300) {
  95.             PIN_OUT();
  96.             C_HIGH();    // CLK=1;
  97.             //D_HIGH();    // OUT=1;
  98.             return -1;//超时,则直接退出程序
  99.         }
  100.     }

  101.         //CLK引脚拉高拉低即为一个时钟
  102.     for(i = 0; i < 29; i++) { // 产生第1到29个时钟
  103.         C_HIGH(); delay_us(1);C_LOW();delay_us(1);
  104.     }

  105.     PIN_OUT();
  106.     C_HIGH();delay_us(1);D_HIGH();C_LOW();delay_us(1);//30
  107.     C_HIGH();delay_us(1);D_LOW();C_LOW();delay_us(1);//31
  108.     C_HIGH();delay_us(1);D_HIGH();C_LOW();delay_us(1);//32
  109.     C_HIGH();delay_us(1);D_LOW();C_LOW();delay_us(1);//33
  110.     C_HIGH();delay_us(1);D_HIGH();C_LOW();delay_us(1);//34
  111.     C_HIGH();delay_us(1);D_HIGH();C_LOW();delay_us(1);//35
  112.     C_HIGH();delay_us(1);D_LOW();C_LOW();delay_us(1);//36
  113.         
  114.     D_HIGH();
  115.     C_HIGH();delay_us(1);C_LOW();delay_us(1);//37  写入0x56 即读命令
  116.    
  117.         dat = 0;
  118.     PIN_IN();
  119.     for(i = 0; i < 8; i++) { // 第38 - 45个脉冲了,读取数据
  120.         C_HIGH();delay_us(1);C_LOW();delay_us(1);
  121.                
  122.         dat <<= 1;
  123.         if(D_IN()==1)
  124.             dat++;
  125.     }
  126.     //第46个脉冲
  127.     C_HIGH();delay_us(1);C_LOW();delay_us(1);
  128.         
  129.     PIN_OUT();
  130.     //D_HIGH();         //OUT引脚拉高
  131.     return dat;
  132. }

  133. uint8_t coda_cs1237::config(void)
  134. {
  135.     uint8_t i;
  136.     uint8_t dat;
  137.     uint16_t count_i = 0;

  138.     PIN_OUT();
  139.     D_HIGH();
  140.     PIN_IN();
  141.     C_LOW();
  142.     while (D_IN()==1)
  143.     {
  144.         delay_ms(1);
  145.         count_i++;
  146.         if(count_i>300)
  147.         {
  148.             PIN_OUT();
  149.             C_HIGH();
  150.             D_HIGH();
  151.             return 0;
  152.         }
  153.     }
  154.     for(i=0;i<29;i++)
  155.     {
  156.         C_HIGH();
  157.         delay_us(1);
  158.         C_LOW();
  159.         delay_us(1);
  160.     }
  161.     PIN_OUT();

  162.     GEN_CLK();//30
  163.     GEN_CLK();//31
  164.     GEN_CLK();//32
  165.     GEN_CLK();//33
  166.     GEN_CLK();//34
  167.     GEN_CLK();//35
  168.     GEN_CLK();//36

  169.     D_HIGH();
  170.     C_HIGH();
  171.     delay_us(1);
  172.     C_LOW();
  173.     delay_us(1);//37

  174.     dat = 0;
  175.     PIN_IN();
  176.     for(i=0;i<8;i++)
  177.     {
  178.         C_HIGH();
  179.         delay_us(1);
  180.         C_LOW();
  181.         delay_us(1);

  182.         dat <<= 1;
  183.         if(D_IN()==1)
  184.         {
  185.             dat++;
  186.         }
  187.     }
  188.     C_HIGH();
  189.     delay_us(1);
  190.     C_LOW();
  191.     delay_us(1);

  192.     PIN_OUT();
  193.     D_HIGH();

  194.     return dat;
  195. }

  196. int32_t coda_cs1237::read()
  197. {
  198.     uint8_t i;
  199.     uint32_t dat = 0;
  200.     uint16_t count_i = 0;
  201.     int32_t temp;

  202.     PIN_OUT();
  203.     D_HIGH();
  204.     PIN_IN();
  205.     C_LOW();
  206.     while (D_IN()==1)
  207.     {
  208.         delay_ms(1);
  209.         count_i++;
  210.         if(count_i>300)
  211.         {
  212.             PIN_OUT();
  213.             C_HIGH();
  214.             D_HIGH();
  215.             return 0;
  216.         }
  217.     }
  218.     dat = 0;
  219.     for(i=0;i<24;i++)
  220.     {
  221.         C_HIGH();
  222.         delay_us(1);
  223.         dat <<= 1;
  224.         if(D_IN()==1)
  225.         {
  226.             dat++;
  227.         }
  228.         C_LOW();
  229.         delay_us(1);
  230.     }

  231.     for(i=0;i<3;i++)
  232.     {
  233.         C_HIGH();
  234.         delay_us(1);
  235.         C_LOW();
  236.         delay_us(1);
  237.     }
  238.     PIN_OUT();
  239.     D_HIGH();

  240.     if(dat&0x00800000)                          // 判断是负数 最高位24位是符号位
  241.     {
  242.         temp=-(((~dat)&0x007FFFFF) + 1);        // 补码变源码
  243.     }
  244.     else
  245.         temp=dat;                               // 正数的补码就是源码

  246.     return temp;
  247. }




复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
发表于 2022-8-23 12:51:37 | 显示全部楼层
太慢了,想办法缩短些!
回复 支持 反对

使用道具 举报

发表于 2022-8-23 13:21:27 | 显示全部楼层
电子秤芯片,没有速度要求的
回复 支持 反对

使用道具 举报

发表于 2022-10-12 08:32:49 | 显示全部楼层
问题解决了吗?最近也要用这款芯片
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-23 05:57 , Processed in 0.171600 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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