[应用相关] Qt APP+STM32平衡小车

[复制链接]
1491|16
 楼主| 慢动作 发表于 2022-2-28 16:19 | 显示全部楼层 |阅读模式
QT, ST
一、 Qt设计

采用了C++——Qt设计了炫酷的主页面,里面包含了各类仪表widget,其中有个类似钢铁侠的按钮可以触发和控制平衡小车的蜂鸣器。设计的摇杆按钮可以控制前进、后退、左转、右转、蓝牙连接等功能。

25617621c85664df31.png

85287621c856e0134d.png

48176621c8576bcbea.png


65037621c858231551.png


79924621c858b3354d.png





 楼主| 慢动作 发表于 2022-2-28 16:22 | 显示全部楼层
Qt_C++工程:
2535621c85ac39fa8.png
 楼主| 慢动作 发表于 2022-2-28 16:23 | 显示全部楼层
部分代码:
#ifndef BLE_H
#define BLE_H

#include "Frm_ControlCar.h"
#include <QWidget>
#include <QListWidgetItem>
#include <QtBluetooth/qbluetoothglobal.h>
#include <QtBluetooth/qbluetoothlocaldevice.h>
#include <qbluetoothaddress.h>
#include <qbluetoothdevicediscoveryagent.h>
#include <qbluetoothlocaldevice.h>
#include <qbluetoothsocket.h>

#include "Public/typedefine.h"

namespace Ui {
class BLE;
}

class Frm_BLE : public QWidget
{
    Q_OBJECT

public:
    explicit Frm_BLE(QWidget *parent = 0);
    ~Frm_BLE();
    bool GetBlueState();
    void BLE_Write(char data);
    void BLE_Read();


private slots:
    void on_btn_openBLE_clicked();
    void on_btn_upDateBLE_clicked();
    void on_btn_return_clicked();
    void slotAddBLDeviToList(const QBluetoothDeviceInfo &info);
    void slotFindFinish();
    void slotClick(QListWidgetItem* item);
    void slotConnectBLE();
    void slotDisConnectBLE();
    void slotConnectOK();
    void slotConnectFailed();
private:
    Ui::BLE *ui;
    QBluetoothSocket *m_BlueSocket;
    QBluetoothDeviceDiscoveryAgent *m_discoveryAgent;
    QBluetoothLocalDevice *m_localDevice;
    QString m_BLName = "";
    bool m_bIsConnected = false;

};

//extern BOOLMY BluetoothPcRxPushFifo(INT8U uch_Data);
//extern BOOLMY BluetoothPcRxPopChar(INT8U *puch_Char);
//extern BOOLMY BluetoothPcTxPushFifo(INT8U uch_Char);
//extern BOOLMY BluetoothPcTxPopChar(INT8U *puch_Char);
//extern void   BluetoothSendEnable(void);

#endif // BLE_H

 楼主| 慢动作 发表于 2022-2-28 16:29 | 显示全部楼层
#ifndef FRM_CONTROLCAR_H
#define FRM_CONTROLCAR_H

#include <QWidget>

namespace Ui {
class Frm_ControlCar;
}

class Frm_ControlCar : public QWidget
{
    Q_OBJECT

public:
    explicit Frm_ControlCar(QWidget *parent = 0);
    ~Frm_ControlCar();

protected:
    void slotDoRockerDirect(int num);
    void slotDoScanTan(int num);

private slots:
    void on_btnToggleBlueTooth_clicked();
    void on_btnInfoFrm_clicked();

private:
    Ui::Frm_ControlCar *ui;

};

#endif // FRM_CONTROLCAR_H

 楼主| 慢动作 发表于 2022-2-28 16:30 | 显示全部楼层
二、Stm32平衡小车部分
采用MPU6050六轴传感器,支持蓝牙模块、OLED、减速电机、RBG三色灯等控制,炫酷的钢铁侠开机动画.
56956621c87f290a31.png
 楼主| 慢动作 发表于 2022-2-28 16:31 | 显示全部楼层
更多细节闲鱼搜索平衡小车。代码部分:

  1. #include "control.h"       
  2. #include "filter.h"       
  3. #include "Stm32_Beep.h"

  4.   /**************************************************************************
  5. 作者:平衡小车之家
  6. 我的淘宝小店:http://shop114407458.taobao.com/
  7. **************************************************************************/
  8. int Balance_Pwm=0,Velocity_Pwm=0,Turn_Pwm=0;
  9. u8 Flag_Target;
  10. /**************************************************************************
  11. 函数功能:所有的控制代码都在这里面
  12.          5ms定时中断由MPU6050的INT引脚触发
  13.          严格保证采样和数据处理的时间同步                                 
  14. **************************************************************************/
  15. int EXTI4_IRQHandler(void)
  16. {   
  17.         if(PAin(4)==0)               
  18.         {   
  19.                 EXTI->PR=1<<4;                      //清除LINE4上的中断标志位  
  20.                 gul_softTmr++;
  21.                
  22.                 Flag_Target=!Flag_Target;
  23.                 if(delay_flag==1)
  24.                 {
  25.                         if(++delay_50==10)       
  26.                         {
  27.                                 delay_50=0,delay_flag=0;    //给主函数提供50ms的精准延时
  28.                         }
  29.                 }
  30.                 if(Flag_Target==1)                                //5ms读取一次陀螺仪和加速度计的值,更高的采样频率可以改善卡尔曼滤波和互补滤波的效果
  31.                 {
  32.                         Get_Angle(Way_Angle);           //===更新姿态       
  33.                         return 0;                                                       
  34.                 }                                   //10ms控制一次,为了保证M法测速的时间基准,首先读取编码器数据
  35.                 Encoder_Left=-Read_Encoder(2);      //===读取编码器的值,因为两个电机的旋转了180度的,所以对其中一个取反,保证输出极性一致
  36.                 Encoder_Right=Read_Encoder(4);      //===读取编码器的值
  37.                   Get_Angle(Way_Angle);               //===更新姿态       
  38.                 //Read_Distane();                     //===获取超声波测量距离值
  39.                   if(Bi_zhang==0)
  40.                 {
  41.                         //Led_Flash(0);                 //===LED闪烁;常规模式 1s改变一次指示灯的状态       
  42.                 }                                   
  43.                 if(Bi_zhang==1)                     
  44.                 {                                   
  45.                         Led_Flash(1);                   //===LED闪烁;避障模式 指示灯常亮       
  46.                 }
  47.                
  48.                   //Voltage=Get_battery_volt();                                     //===获取电池电压                  
  49.                 Key();                                                          //===扫描按键状态 单击双击可以改变小车运行状态
  50.                
  51.                 Balance_Pwm = balance(Angle_Balance,Gyro_Balance);              //===平衡PID控制       
  52.                 Velocity_Pwm = velocity(Encoder_Left,Encoder_Right);            //===速度环PID控制         记住,速度反馈是正反馈,就是小车快的时候要慢下来就需要再跑快一点
  53.             Turn_Pwm = turn(Encoder_Left,Encoder_Right,Gyro_Turn);          //===转向环PID控制  
  54.                
  55.                 Moto1=Balance_Pwm-Velocity_Pwm+Turn_Pwm;                            //===计算左轮电机最终PWM
  56.                   Moto2=Balance_Pwm-Velocity_Pwm-Turn_Pwm;                            //===计算右轮电机最终PWM
  57.                    Xianfu_Pwm();                                                       //===PWM限幅
  58.                
  59.                 if(Pick_Up(Acceleration_Z,Angle_Balance,Encoder_Left,Encoder_Right))//===检查是否小车被那起
  60.                 {
  61.                         Flag_Stop=1;                                                        //===如果被拿起就关闭电机
  62.                 }
  63.                 if(Put_Down(Angle_Balance,Encoder_Left,Encoder_Right))              //===检查是否小车被放下
  64.                 {
  65.                         Flag_Stop=0;                                                        //===如果被放下就启动电机
  66.                 }
  67.                 if(Turn_Off(Angle_Balance,Voltage)==0)                              //===如果不存在异常
  68.                 {
  69.                         Set_Pwm(Moto1,Moto2);                                           //===赋值给PWM寄存器  
  70.                 }
  71.         }              
  72.          return 0;          
  73. }

  74. /**************************************************************************
  75. 函数功能:直立PD控制
  76. 入口参数:角度、角速度
  77. 返回  值:直立控制PWM
  78. 作    者:平衡小车之家
  79. **************************************************************************/
  80. int balance(float Angle,float Gyro)
  81. {  
  82.         float Bias,kp=480,kd=0.73;
  83.         int balance;
  84.         Bias=Angle-ZHONGZHI;       //===求出平衡的角度中值 和机械相关
  85.         balance=kp*Bias+Gyro*kd;   //===计算平衡控制的电机PWM  PD控制   kp是P系数 kd是D系数
  86.         return balance;
  87. }

  88. /**************************************************************************
  89. 函数功能:速度PI控制 修改前进后退速度,请修Target_Velocity,比如,改成60就比较慢了
  90. 入口参数:左轮编码器、右轮编码器
  91. 返回  值:速度控制PWM
  92. 作    者:平衡小车之家
  93. **************************************************************************/
  94. int velocity(int encoder_left,int encoder_right)
  95. {  
  96.         static float Velocity,Encoder_Least,Encoder,Movement;
  97.         static float Encoder_Integral,Target_Velocity;
  98.         ///float kp=-120,ki=-0.6;
  99.         float kp=-200,ki=-0.9;
  100.        
  101.         //=============遥控前进后退部分=======================//
  102.         if(Bi_zhang==1&&Flag_sudu==1)  
  103.         {
  104.                 Target_Velocity=45;                 //如果进入避障模式,自动进入低速模式
  105.         }
  106.         else                                  
  107.         {
  108.                 Target_Velocity=30;//90;   
  109.         }       
  110.        
  111.         if(1==Flag_Qian)           
  112.         {
  113.                 Movement=-Target_Velocity/Flag_sudu;              //===前进标志位置1
  114.         }
  115.         else if(1==Flag_Hou)       
  116.         {
  117.                 Movement=Target_Velocity/Flag_sudu;      //===后退标志位置1
  118.         }
  119.         else  
  120.         {
  121.                 Movement=0;       
  122.         }
  123.        
  124.         if(Bi_zhang==1 && Distance<500 && Flag_Left!=1 &&Flag_Right!=1)        //避障标志位置1且非遥控转弯的时候,进入避障模式
  125.         {
  126.                 Movement=-Target_Velocity/Flag_sudu;
  127.         }
  128.        
  129.    //=============速度PI控制器=======================//       
  130.         Encoder_Least =(Encoder_Left+Encoder_Right)-0;                    //===获取最新速度偏差==测量速度(左右编码器之和)-目标速度(此处为零)
  131.         Encoder *= 0.8;                                                              //===一阶低通滤波器      
  132.         Encoder += Encoder_Least*0.2;                                          //===一阶低通滤波器   
  133.         Encoder_Integral +=Encoder;                                       //===积分出位移 积分时间:10ms
  134.         Encoder_Integral=Encoder_Integral-Movement;                       //===接收遥控器数据,控制前进后退
  135.         if(Encoder_Integral>10000)          Encoder_Integral=10000;           //===积分限幅
  136.         if(Encoder_Integral<-10000)        Encoder_Integral=-10000;              //===积分限幅       
  137.         Velocity=Encoder*kp+Encoder_Integral*ki;                          //===速度控制       
  138.         if(Turn_Off(Angle_Balance,Voltage)==1||Flag_Stop==1)   
  139.         {
  140.                 Encoder_Integral=0;      //===电机关闭后清除积分
  141.         }
  142.         return Velocity;
  143. }

  144. /**************************************************************************
  145. 函数功能:转向控制  修改转向速度,请修改Turn_Amplitude即可
  146. 入口参数:左轮编码器、右轮编码器、Z轴陀螺仪
  147. 返回  值:转向控制PWM
  148. 作    者:平衡小车之家
  149. **************************************************************************/
  150. int turn(int encoder_left,int encoder_right,float gyro)//转向控制
  151. {
  152.         static float Turn_Target,Turn,Encoder_temp,Turn_Convert=0.9,Turn_Count;
  153.         float Turn_Amplitude=88/Flag_sudu,Kp=42,Kd=0;
  154.    
  155.         //=============遥控左右旋转部分=======================//
  156.         if(1==Flag_Left||1==Flag_Right)                      //这一部分主要是根据旋转前的速度调整速度的起始速度,增加小车的适应性
  157.         {
  158.                 if(++Turn_Count==1)
  159.                 Encoder_temp=myabs(encoder_left+encoder_right);
  160.                 Turn_Convert=50/Encoder_temp;
  161.                 if(Turn_Convert<0.6)Turn_Convert=0.6;
  162.                 if(Turn_Convert>3)Turn_Convert=3;
  163.         }       
  164.         else
  165.         {
  166.                 Turn_Convert=0.9;
  167.                 Turn_Count=0;
  168.                 Encoder_temp=0;
  169.         }                       
  170.         if(1==Flag_Left)                   Turn_Target-=Turn_Convert;
  171.         else if(1==Flag_Right)             Turn_Target+=Turn_Convert;
  172.         else Turn_Target=0;
  173.        
  174.     if(Turn_Target>Turn_Amplitude)  Turn_Target=Turn_Amplitude;    //===转向速度限幅
  175.         if(Turn_Target<-Turn_Amplitude) Turn_Target=-Turn_Amplitude;
  176.         if(Flag_Qian==1||Flag_Hou==1)  Kd=0.5;        
  177.         else Kd=0;   //转向的时候取消陀螺仪的纠正 有点模糊PID的思想
  178.           //=============转向PD控制器=======================//
  179.         Turn=-Turn_Target*Kp -gyro*Kd;                 //===结合Z轴陀螺仪进行PD控制
  180.         return Turn;
  181. }

  182. /**************************************************************************
  183. 函数功能:赋值给PWM寄存器
  184. 入口参数:左轮PWM、右轮PWM
  185. 返回  值:无
  186. **************************************************************************/
  187. void Set_Pwm(int moto1,int moto2)
  188. {
  189.         if(moto1<0)                        AIN2=1,                        AIN1=0;
  190.         else                   AIN2=0,                        AIN1=1;
  191.         PWMA=myabs(moto1);
  192.         if(moto2<0)        BIN1=0,                        BIN2=1;
  193.         else        BIN1=1,                        BIN2=0;
  194.         PWMB=myabs(moto2);       
  195. }

  196. /**************************************************************************
  197. 函数功能:限制PWM赋值
  198. 入口参数:无
  199. 返回  值:无
  200. **************************************************************************/
  201. void Xianfu_Pwm(void)
  202. {       
  203.         int Amplitude=6900;    //===PWM满幅是7200 限制在6900
  204.         if(Flag_Qian==1)  Moto1-=DIFFERENCE;  //DIFFERENCE是一个衡量平衡小车电机和机械安装差异的一个变量。直接作用于输出,让小车具有更好的一致性。
  205.         if(Flag_Hou==1)   Moto2+=DIFFERENCE;
  206.         if(Moto1<-Amplitude) Moto1=-Amplitude;       
  207.         if(Moto1>Amplitude)  Moto1=Amplitude;       
  208.         if(Moto2<-Amplitude) Moto2=-Amplitude;       
  209.         if(Moto2>Amplitude)  Moto2=Amplitude;               
  210.        
  211. }
  212. /**************************************************************************
  213. 函数功能:按键修改小车运行状态
  214. 入口参数:无
  215. 返回  值:无
  216. **************************************************************************/
  217. void Key(void)
  218. {       
  219.         u8 tmp,tmp2;
  220.         tmp=click_N_Double(50);
  221.        
  222.         if(tmp==1)
  223.                 Flag_Stop=!Flag_Stop;//单击控制小车的启停
  224.        
  225.         if(tmp==2)
  226.                 Flag_Show=!Flag_Show;//双击控制小车的显示状态
  227.        
  228.         tmp2=Long_Press();                  
  229.         if(tmp2==1)
  230.                 Bi_zhang=!Bi_zhang;                //长按控制小车是否进入超声波避障模式
  231. }

  232. /**************************************************************************
  233. 函数功能:异常关闭电机
  234. 入口参数:倾角和电压
  235. 返回  值:1:异常  0:正常
  236. **************************************************************************/
  237. u8 Turn_Off(float angle, int voltage)
  238. {
  239.         u8 temp;
  240.         //if(angle<-40||angle>40||1==Flag_Stop||voltage<1110)                //电池电压低于11.1V关闭电机
  241.         if(angle<-40||angle>40||1==Flag_Stop)                //去掉电池电压低于11.1V关闭电机
  242.         {                                                                 //===倾角大于40度关闭电机
  243.                 temp=1;                                                    //===Flag_Stop置1关闭电机
  244.                 AIN1=0;                                            
  245.                 AIN2=0;
  246.                 BIN1=0;
  247.                 BIN2=0;
  248.         }
  249.         else
  250.         {
  251.                 temp=0;
  252.         }
  253.         return temp;                       
  254. }
  255.        
  256. /**************************************************************************
  257. 函数功能:获取角度 三种算法经过我们的调校,都非常理想
  258. 入口参数:获取角度的算法 1:DMP  2:卡尔曼 3:互补滤波
  259. 返回  值:无
  260. **************************************************************************/
  261. void Get_Angle(u8 way)
  262. {
  263.         float Accel_Y,Accel_X,Accel_Z,Gyro_Y,Gyro_Z;
  264.         Temperature=Read_Temperature();      //===读取MPU6050内置温度传感器数据,近似表示主板温度。
  265.         if(way==1)                           //===DMP的读取在数据采集中断提醒的时候,严格遵循时序要求
  266.         {       
  267.                 Read_DMP();                      //===读取加速度、角速度、倾角
  268.                
  269.                 //Angle_Balance=Pitch;             //===更新平衡倾角--
  270.                 Angle_Balance=Roll;             //===更新平衡倾角---
  271.                
  272.                 //Gyro_Balance=gyro[1];            //===更新平衡角速度
  273.                 Gyro_Balance=gyro[0];            //===更新平衡角速度
  274.                
  275.                 Gyro_Turn=gyro[2];               //===更新转向角速度
  276.                 Acceleration_Z=accel[2];         //===更新Z轴加速度计
  277.         }                       
  278.         else
  279.         {
  280.                 Gyro_Y=(I2C_ReadOneByte(devAddr,MPU6050_RA_GYRO_YOUT_H)<<8)+I2C_ReadOneByte(devAddr,MPU6050_RA_GYRO_YOUT_L);    //读取Y轴陀螺仪
  281.                 Gyro_Z=(I2C_ReadOneByte(devAddr,MPU6050_RA_GYRO_ZOUT_H)<<8)+I2C_ReadOneByte(devAddr,MPU6050_RA_GYRO_ZOUT_L);    //读取Z轴陀螺仪
  282.                 Accel_X=(I2C_ReadOneByte(devAddr,MPU6050_RA_ACCEL_XOUT_H)<<8)+I2C_ReadOneByte(devAddr,MPU6050_RA_ACCEL_XOUT_L); //读取X轴加速度计
  283.                 Accel_Z=(I2C_ReadOneByte(devAddr,MPU6050_RA_ACCEL_ZOUT_H)<<8)+I2C_ReadOneByte(devAddr,MPU6050_RA_ACCEL_ZOUT_L); //读取Z轴加速度计
  284.                 if(Gyro_Y>32768)  Gyro_Y-=65536;                       //数据类型转换  也可通过short强制类型转换
  285.                 if(Gyro_Z>32768)  Gyro_Z-=65536;                       //数据类型转换
  286.                 if(Accel_X>32768) Accel_X-=65536;                      //数据类型转换
  287.                 if(Accel_Z>32768) Accel_Z-=65536;                      //数据类型转换
  288.                 Gyro_Balance=-Gyro_Y;                                  //更新平衡角速度
  289.                 Accel_Y=atan2(Accel_X,Accel_Z)*180/PI;                 //计算倾角       
  290.                 Gyro_Y=Gyro_Y/16.4;                                    //陀螺仪量程转换       
  291.                 if(Way_Angle==2)                          Kalman_Filter(Accel_Y,-Gyro_Y);//卡尔曼滤波       
  292.                 else if(Way_Angle==3)   Yijielvbo(Accel_Y,-Gyro_Y);    //互补滤波
  293.                 Angle_Balance=angle;                                   //更新平衡倾角
  294.                 Gyro_Turn=Gyro_Z;                                      //更新转向角速度
  295.                 Acceleration_Z=Accel_Z;                                //===更新Z轴加速度计       
  296.         }
  297. }
  298. /**************************************************************************
  299. 函数功能:绝对值函数
  300. 入口参数:int
  301. 返回  值:unsigned int
  302. **************************************************************************/
  303. int myabs(int a)
  304. {                   
  305.         int temp;
  306.         if(a<0)  temp=-a;  
  307.         else temp=a;
  308.         return temp;
  309. }
  310. /**************************************************************************
  311. 函数功能:检测小车是否被拿起
  312. 入口参数:int
  313. 返回  值:unsigned int
  314. **************************************************************************/
  315. int Pick_Up(float Acceleration,float Angle,int encoder_left,int encoder_right)
  316. {                   
  317.         static u16 flag,count0,count1,count2;
  318.         if(flag==0)                                                                 //第一步
  319.         {
  320.                 if(myabs(encoder_left)+myabs(encoder_right)<30)                         //条件1,小车接近静止
  321.                 {
  322.                         count0++;
  323.                 }
  324.                 else
  325.                 {
  326.                         count0=0;
  327.                 }
  328.                
  329.                 if(count0>10)       
  330.                 {                       
  331.                         flag=1,count0=0;
  332.                 }
  333.         }
  334.        
  335.         if(flag==1)                                                                 //进入第二步
  336.         {
  337.                 if(++count1>200)      
  338.                 {
  339.                         count1=0,flag=0;                                                                         //超时不再等待2000ms
  340.                 }
  341.                 if(Acceleration>26000&&(Angle>(-20+ZHONGZHI))&&(Angle<(20+ZHONGZHI)))   //条件2,小车是在0度附近被拿起
  342.                 {
  343.                         flag=2;
  344.                 }
  345.         }
  346.        
  347.         if(flag==2)                                                                  //第三步
  348.         {
  349.                 if(++count2>100)       count2=0,flag=0;                                   //超时不再等待1000ms
  350.                 if(myabs(encoder_left+encoder_right)>135)                                   //条件3,小车的轮胎因为正反馈达到最大的转速   
  351.                 {
  352.                         flag=0;                                                                                    
  353.                         return 1;                                                           //检测到小车被拿起
  354.                 }
  355.         }
  356.         return 0;
  357. }
  358. /**************************************************************************
  359. 函数功能:检测小车是否被放下
  360. 入口参数:int
  361. 返回  值:unsigned int
  362. **************************************************************************/
  363. int Put_Down(float Angle,int encoder_left,int encoder_right)
  364. {                   
  365.         static u16 flag,count;         
  366.         if(Flag_Stop==0)                           //防止误检      
  367.                 return 0;                         
  368.         if(flag==0)                                               
  369.         {
  370.                 if(Angle>(-10+ZHONGZHI)&&Angle<(10+ZHONGZHI)&&encoder_left==0&&encoder_right==0)         //条件1,小车是在0度附近的
  371.                 flag=1;
  372.         }
  373.         if(flag==1)                                               
  374.         {
  375.                 if(++count>50)                                          //超时不再等待 500ms
  376.                 {
  377.                         count=0;flag=0;
  378.                 }
  379.                 //if(encoder_left>3&&encoder_right>3&&encoder_left<60&&encoder_right<60)                //条件2,小车的轮胎在未上电的时候被人为转动  
  380.                 if(encoder_left>=0&&encoder_right>=0&&encoder_left<60&&encoder_right<60)                //条件2,小车的轮胎在未上电的时候被人为转动  
  381.                 {
  382.                         flag=0;
  383.                         flag=0;
  384.                         return 1;                                             //检测到小车被放下
  385.                 }
  386.         }
  387.         return 0;
  388. }



earlmax 发表于 2022-11-19 13:47 | 显示全部楼层
用步进电机做的自平衡小车 电机怎么控制?  
updownq 发表于 2022-11-20 11:10 | 显示全部楼层
stm32平衡小车供电分开可以吗
Pulitzer 发表于 2023-9-24 11:53 | 显示全部楼层

---------------------------
wpsoffice
---------------------------
对话框打开时命令无法执行。单击“确定”,然后关闭对话框再试。
---------------------------
确定   
---------------------------
Wordsworth 发表于 2023-9-25 07:12 | 显示全部楼层

电流若是偏大就会直接导致器件烧毁
Clyde011 发表于 2023-9-25 08:15 | 显示全部楼层

人体具有300PF的等效电容
周半梅 发表于 2023-9-25 09:38 | 显示全部楼层

#include "SC_it1.h"
帛灿灿 发表于 2023-9-25 09:47 | 显示全部楼层

void sendbye(unsigned char i1)//1个8bit
{
        if(i1&0x80){send1();}else{send0();}
        if(i1&0x40){send1();}else{send0();}
        if(i1&0x20){send1();}else{send0();}
        if(i1&0x10){send1();}else{send0();}
        if(i1&0x08){send1();}else{send0();}
        if(i1&0x04){send1();}else{send0();}
        if(i1&0x02){send1();}else{send0();}
        if(i1&0x01){send1();}else{send0();}
}
万图 发表于 2023-9-25 10:11 | 显示全部楼层

从而达到对电子设备进行静电保护
Uriah 发表于 2023-9-25 11:14 | 显示全部楼层

齐纳二极管的缺点是不如TVS快
稳稳の幸福 发表于 2023-9-25 13:08 | 显示全部楼层
QT做上位机是很方便的。
帛灿灿 发表于 2023-9-25 13:10 | 显示全部楼层

就是因为它的作用就是在电子产品设备受到雷击浪涌与ESD静电放电或者其他瞬态电压时
Bblythe 发表于 2023-9-25 14:13 | 显示全部楼层

这方便一般可以使用底涂的方式来改善
周半梅 发表于 2023-9-25 16:09 | 显示全部楼层

正常信号一般达不到导通电压
周半梅 发表于 2023-9-25 18:15 | 显示全部楼层

VHumanBody为 8kV
您需要登录后才可以回帖 登录 | 注册

本版积分规则

82

主题

1071

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部