前段时间为了测试实验器材的阻尼,需要去开发一套装置来测试。提出用Arduino单片机来控制电动推杆(Linear Actuator)来制造相应速度的运动,搭配上测力计,从而根据来测得阻尼,在这里简单记录一下全过程。这款电动推杆是带AB相增量式磁编码器的,但是我们也可以选择不利用编码器,即将其当作一个普通电机进行使用。本文代码可以直接拷贝使用。


目录

一、基本原理

二、不带编码器(PWM)接线

1、L289N接线

2、Arduino接线

三、带编码器接线

四、Arduino代码(不带编码器控制电动推杆速度)

五、Arduino代码(带编码器控制电动推杆速度)

六、拓展:MATLAB与Arduino连接及代码


一、基本原理

(28条消息) 关于电机编码器的知识汇总,都在这里了!_张巧龙的博客-CSDN博客https://blog.csdn.net/best_xiaolong/article/details/114274883?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%B8%A6%E7%BC%96%E7%A0%81%E5%99%A8%E7%94%B5%E6%9C%BA&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-114274883.nonecase&spm=1018.2226.3001.4187一、PWM:

简单来说就是通过带一定频率的开关动作来实现调节平均电压的方法。这里通过发送数字信号(即满电压1或无电压0),这里利用方波的占空比被调制的方法对一个具体模拟信号的电平进行编码。

二、编码器:

编码器在电动推杆中是一种检测线性位移的传感器,其由电动机来驱动,可以将线性位移进行编码。

三、带编码器和不带编码器之间的区别:

不带编码器指的就是开环控制(Open-loop control),想调节电机的速度只取决于单片机给到电机的PWM信号(即脉冲信号数量和之间的间隔)。其优点是系统简单,缺点是运行效率很低,因为其总是在最大电流和0之间切换以防止失步。并且实际发现占空比设置得较小的时候,推杆速度将会不稳定。另外通过人工去测量电动推杆的运行速度,误差很大。

带编码器指的是闭环控制(Closed-loop control),也指的是PID控制。加入了AB相磁通量式编码器来作为监测器,其能够将位移转换成周期性的电信号,再将电信号转换为计数脉冲,有AB两个相可以正反向计数。单片机能够通过读取编码器输出的脉冲的上升沿和脉冲个数来测得电动推杆的转动方向和实际速度,再根据PI控制器可以算出一个将电动推杆调整到目标速度的PWM值,最后将PWM值输出给电机。这个[对比输入信号和实际信号,进行一个反馈,修正输入信号]的过程会一直循环,会形成一个闭环系统。对比不带编码器的情况,其可以不必保持最大电流,降低系统整体功耗,而且控制也会更精确,输出的速度更加稳定。

PID控制分为增量式PID和位置式PID,在本文中,指的是增量式PID(市面上大多数编码器电机),可以用于让速度动态维持在一个目标值。PID对比PWM方法去控制电机转速,其优势是能够使速度更稳定(如实际操作中,转速很难达到并保持166.5 RPM,有可能为150、170 RPM,反正就不会保持166.5 RPM,此时就需要用到一个闭环的算法(增量式PID))。并且抗干扰能力强,这也是闭环系统对比开环系统的优势。

二、不带编码器(PWM)接线

(26条消息) STM32f4日记5之AB相编码器测速实验(TIM定时器的编码器模式使用)_@SHAWN_shawn的博客-CSDN博客_ab相霍尔编码器https://blog.csdn.net/qq_51564898/article/details/113359450

我这里采用了Arduino uno+L289N+电动推杆(电动机+编码器)的组合。接线图如下:

1、L289N接线注意事项

用Arduino和L298N控制直流电机的正反转和调速_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1eE411F7HP/?spm_id_from=autoNext&vd_source=1fcf4febef247ec78f783870e62a07d6以上这个视频从电压的角度讲了接线的问题以及功率的问题。接线顺序由左至右:

接线注释:

  1. 输出端Out1 Out2:分别连接电机的正负极。(若想让电机反转,只需要改变输出A的正负两极方向即可。)
  2. 输出端旁边的板载5V电源的跳线帽需要接上。
  3. GND:连接变压电源的负极+连接Arduino的负极。(共地很重要,因为如果不连接在一起,电压就没有参考电平,就无法进行正常的控制了)
  4. +5V供电口:有电源模块可以给单片机供电,这里可以不接。(图上是接的)
  5. ENA:是左侧Out1、Out2的使能端,这里由于需要实现PWM控制电机转速,因此跳线帽需要拔下来。如果不拔下来,使能端一直就为高电平,即全速运转。ENA下方引脚与Arduino相连。
  6. IN1、IN2:作为逻辑输入连接Arduino。可以接受高、低电平信号。

2、Arduino UNO接线注意事项

接线注释:

  1. 7、8号口接L289N驱动的IN1、IN2;
  2. 9号口作为(PWM带波浪号~)输出信号端与ENA下侧引脚连接;
  3. 与电脑利用USB进行连接;使用USB供电时,5V接口直接输出USB提供的5v电压;使用外部电源供电时,5V输出稳压后的5v电压。
  4. 这里由于L289N有外接的电源,这里就不供5V的电压进去了。(但图上是接了的)
  5. GND与L289N驱动的GND相连;

三、带编码器接线

由于Arduino UNO上没有stm32上那种编码器模式,因此这里利用了MsTimer2.h的定时中断库。接线方式基本和不带编码器接线时的一致,如图所示:

接线注释:

  1. Arduino UNO板子中,2、3号接口是可以输入外部中断信号的;外部中断信号分为低电平LOW,电平状态改变CHANGE(即上升沿和下降沿都触发),上升沿RISING触发,下降沿FALLING触发。
  2. 9号口作为(PWM带波浪号~)输出信号端与ENA下侧引脚连接;

四、Arduino代码(不带编码器控制电动推杆速度)

这里有两个子程序,要用哪个,就把另外一个注释掉就好。对比stm32,类似analogWrite是封装了很多隐藏库的,因此只需要一条语句即可进行输出,无须像stm32一样配置寄存器库。

#define ENA 9   //以下三个都是输出
#define IN1 8
#define IN2 7
void setup() {pinMode(ENA,OUTPUT);pinMode(IN1,OUTPUT);pinMode(IN2,OUTPUT);Serial.begin(9600);
}
void loop() {Pos_NegRotation(); //以下有两个子程序PWMcontrol(); //脉宽调制控制速度从小到大
}
void Pos_NegRotation() //这个是控制电机正、反转、刹车的
{analogWrite(ENA,80);  //这个80/255即指的是占空比digitalWrite(IN1,HIGH); //高电平digitalWrite(IN2,LOW);  //低电平delay(2000);   //暂停2秒digitalWrite(IN1,HIGH); //高电平digitalWrite(IN2,HIGH);  //低电平delay(2000);   //暂停2秒digitalWrite(IN1,LOW); //高电平digitalWrite(IN2,HIGH);  //低电平delay(2000);   //暂停2秒digitalWrite(IN1,LOW); //高电平digitalWrite(IN2,LOW);  //低电平delay(2000);   //暂停2秒
}void Pos_NegRotation() //这个是控制电机速度从小到大的
{int i;  //预定义digitalWrite(IN1,HIGH); //预定义电机反转digitalWrite(IN2,LOW); for(i=0;i<=255;i++)   //即占空比由小到大{Serial.print("Value_i ="); //以下两行为串口打印数值Serial.println(i);  analogWrite(ENA,i); //把i写入使能口=D9delay(20); //延时20 ms}digitalWrite(IN1,HIGH); //停2秒digitalWrite(IN2,HIGH); //delay(2000);
}

五、Arduino代码(带编码器控制电动推杆速度)

(15条消息) Arduino 让小车走直线的秘密 增量式PID 直流减速编码电机_浩浩的科研笔记的博客-CSDN博客_pid控制小车跑直线程序https://blog.csdn.net/chrnhao/article/details/112639533?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_utm_term~default-1.pc_relevant_baidujshouduan&spm=1001.2101.3001.42421.这里参考的是上述这位博主所提供的代码,适当补上了注释,并针对UNO板子做出了调整。另外我后面尝试了一下,并没有选择引用外部的定时器库,因为发现引用了之后总是报错。

PID参数遵循:先调I,再调P。速度闭环不使用D微分项。

06_Arduino_PID教程_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1xB4y1v72z/?spm_id_from=333.337.search-card.all.click&vd_source=1fcf4febef247ec78f783870e62a07d6

这个是来自清华大学电机系分享的PID教程,代码讲得很清楚。

#define ENCODER_A 2                //编码器A相引脚,在uno板子中,中断0指的是引脚2,
#define ENCODER_B 3                //编码器B相引脚,在uno板子中,中断1指的是引脚3,其可以输入外部中断信号
const unsigned int L298N_IN1=7;    //IN1
const unsigned int L298N_IN2=8;    //IN2
const unsigned int Motor_PWM=9;    //ENAint value;                         //用于存储通过PI控制器计算得到的用于调整电机转速的PWM值的整形变量
#include <MsTimer2.h>           //定时中断头文件库String Target_Value;               //串口获取的速度字符串变量
int Velocity,Count=0;              //Count计数变量 Velocity存储设定时间内A相上升沿和下降沿的个数
float Velocity_KP =7.2, Velocity_KI =0.68,Target=0;//Velocity_KP,Velocity_KI.PI参数  Target目标值
/*
Kp是让实际值保持在一个固定值左右的浮动
Ki是让固定值为目标值,即消除稳态误差
*/
int startPWM=30;                   //输出的PWM小于30的时候电机不转,设置初始值为30
int PWM_Restrict=255;              //PWM数不能超过255/*
*(1)计数器方向:商家给出的那一幅图的信息是:A相上升沿触发时,B相是低电平,跟A相下降沿触发时B是高电平是一个方向。将这种将count累计为正;
*(2)电机输出方向(控制电机转速方向的接线是正着接还是反着接)
*(3)PI 控制器 里面的误差(Basi)运算是目标值减当前值(Target-Encoder),还是当前值减目标值(Encoder-Target)
*三个方向只有对应上才会有效果否则你接上就是使劲的朝着一个方向(一般来说是反方向)满速旋转
*/
void READ_ENCODER_A()
{if (digitalRead(ENCODER_A) == HIGH) {     if (digitalRead(ENCODER_B) == LOW)      Count++;  //根据另外一相电平判定方向else      Count--;}else {    if (digitalRead(ENCODER_B) == LOW)      Count--; //即两个都是LOW,根据另外一相电平判定方向else      Count++;}
}void setup()
{Serial.begin(9600);              //打开串口Serial.println("/*****开始驱动*****/");pinMode(ENCODER_A,INPUT);        //设置AB相为输入模式pinMode(ENCODER_B,INPUT);pinMode(L298N_IN1,OUTPUT);       //设置两个驱动引脚为输出模式  pinMode(L298N_IN2,OUTPUT); pinMode(Motor_PWM,OUTPUT);       //设置使能引脚为输出模式MsTimer2::set(5, control);       //每5ms进入一个中断服务程序 control() MsTimer2::start ();              //开始计时attachInterrupt(0, READ_ENCODER_A, CHANGE);  //开启对应5号引脚的0号外部中断(在Arduino UNO中,中断0是指D2引脚,中断1是指D3引脚。其他板子并不同)//触发方式为CHANGE,表示电平变化就会触发,即上升沿和下降沿都触发,触发的中断函数为 READ_ENCODER_A
}void loop()
{while(Serial.available()>0)       //检测串口是否接收到了数据{Target_Value=Serial.readString();  //读取串口字符串Target=Target_Value.toFloat();     //将字符串转换为浮点型,并将其赋给目标值Serial.print("目标转速频率:");      //串口打印出设定的目标转速Serial.println(Target);}Serial.println(Velocity);          //可以在串口监视器里面看速度是否匀速
}/****定时器中断触发函数****/
void control()
{     Velocity=Count;    //把采用周期(内部定时中断周期)所累计的脉冲上升沿和下降沿的个数,赋值给速度Count=0;           //清零value=Incremental_PI_A(Velocity,Target);//通过目标值和当前值在这个函数下算出我们需要调整用的PWM值Set_PWM(value);    //将算好的值输出给电机
}/****PI控制器****/
int Incremental_PI_A (int Encoder,int Target)
{  float Bias;                                           //定义全局浮点型变量Bias(本次偏差)static float PWM=0,Last_bias=0;                       //定义全局静态浮点型变量 PWM并预设为0,Last_bias(上次偏差)并预设为0Bias=Target-Encoder;                                  //计算偏差,目标值减去当前值PWM+=Velocity_KP*(Bias-Last_bias)+Velocity_KI*Bias;   //增量式PI控制器计算if(PWM>PWM_Restrict)PWM=PWM_Restrict;                 //限幅if(PWM<-PWM_Restrict)PWM=-PWM_Restrict;               //限幅  Last_bias=Bias;                                       //保存上一次偏差 return PWM;                                           //增量输出
}/****实际控制函数****/
void Set_PWM(int motora)
{ if (motora > 0)                                        //如果算出来的PWM为正{digitalWrite(L298N_IN1,HIGH);                        //让PWM在所设定的正转方向上调整digitalWrite(L298N_IN2,LOW);analogWrite(Motor_PWM, motora+startPWM);}else if(motora == 0)                                   //PWM=0就停车{digitalWrite(L298N_IN1,LOW);digitalWrite(L298N_IN2,LOW);}else if (motora < 0)                                   //如果算出来的PWM为负{digitalWrite(L298N_IN1,LOW);                         //让PWM在所设定的反转方向上调整digitalWrite(L298N_IN2,HIGH);    analogWrite(Motor_PWM, -motora+startPWM);}
}

经发现,上面这个代码运行有问题,(原因应该是loop函数并不正确,一直报错exit 1,相当于缺少了loop)自己结合各个资料重新编写了一下,并且重新理解了电动推杆速度的计算方法,即在通常计算出的圈/秒速度后需要乘以导程(导程S:螺旋线绕圆柱体转一圈,沿圆柱体轴线方向移动的距离)才为电动推杆的速度。

#define ENCODER_A 2                //编码器A相引脚,在uno板子中,中断号0指的是引脚2,其可以输入外部中断信号
#define ENCODER_B 3                //编码器B相引脚,在uno板子中,中断号1指的是引脚3,其可以输入外部中断信号
#define L298N_IN1 7                //IN1
#define L298N_IN2 8                //IN2
#define Motor_PWM 9                //ENAvolatile float motor=0;//中断变量,子脉冲计数
float V=0; //速度 单位cm/s
float Target_V=20;   //目标速度,单位cm/s
int PWM=0;  //用于存储通过PI控制器计算得到的用于调整电机转速的PWM值的整形变量
float Velocity_KP =7.2, Velocity_KI =0.68,Target=0;     //Velocity_KP,Velocity_KI.PI参数  Target目标值,这里是PI控制/** Arduino初始化函数*/
void setup()
{Motor_Init();                    //电机端口初始化Serial.begin(9600);              //打开串口Serial.println("/*****开始驱动*****/");
}void loop() {Read_Motor_V();//读取脉冲计算速度okPWM= Incremental_PI(V,Target_V);//PI运算okSerial.println(V);  //直接用串口绘图画出速度曲线okSet_Pwm(1,PWM);  //设置方向,设置速度(两个方向都可以试试,最好能用之前那个方法,自动调整一下方向)ok
}void Set_Pwm(int mode,int speed){ if(mode==1){//正转模式,如果方向有问题,就换另外一个模式。okdigitalWrite(L298N_IN1,LOW);digitalWrite(L298N_IN2,HIGH);analogWrite(Motor_PWM,speed);}else if(mode==2){//反转模式digitalWrite(L298N_IN1,HIGH);digitalWrite(L298N_IN2,LOW);analogWrite(Motor_PWM,speed);}
}/** 电机端口初始化函数,控制芯片引脚全部拉低*/
void Motor_Init(){//电动推杆pinMode(ENCODER_A,INPUT); //左轮编码器A引脚,设置为输入模式pinMode(ENCODER_B,INPUT); //左轮编码器B引脚,设置为输入模式pinMode(L298N_IN1,OUTPUT);  //设置两个驱动引脚为输出模式  pinMode(L298N_IN2,OUTPUT);  //pinMode(Motor_PWM,OUTPUT);   //设置使能引脚为输出模式//驱动芯片控制引脚全部拉低digitalWrite(L298N_IN1,LOW); digitalWrite(L298N_IN2,LOW);digitalWrite(Motor_PWM,LOW);
}/********************************************************** 增量式调速算法的C语言表达* 函数功能:增量式PI控制器* 入口参数:当前速度(编码器测量值),目标速度* 返回值:电机PWM * 参考资料: *    增量式离散PID公式:*                Pwm-=Kp*[e(k)-e(k-1)]+Ki*e(k)+Kd*[e(k)-2e(k-1)+e(k-2)]*                e(k):本次偏差*                e(k-1):上一次偏差*                e(k-2):上上次偏差*                Pwm:代表增量输出*    在速度闭环控制系统里面我们只使用PI控制,因此对PID公式可简化为:*                Pwm-=Kp*[e(k)-e(k-1)]+Ki*e(k)*                e(k):本次偏差*                e(k-1):上一次偏差*                Pwm:代表增量输出*                Kp是让实际值保持在一个固定值左右的浮动*                Ki是让固定值为目标值,即消除稳态误差*     注意增量式PID先调I,再调P,最后再调D
/****PI控制器****/
int Incremental_PI(float current,float Target)
{  static float pwm,Bias,Last_bias;                       //定义全局静态浮点型变量 PWM并预设为0,Last_bias(上次偏差)并预设为0Bias=Target-current;                                  //计算偏差,目标值减去当前值pwm+=Velocity_KP*(Bias-Last_bias)+Velocity_KI*Bias;   //增量式PI控制器计算if(pwm>250)pwm=250;                 //限幅250,最高为255if(pwm<-250)pwm=-250;               //限幅  Last_bias=Bias;                                       //保存上一次偏差 return pwm;                                           //增量输出
}/************************************ 电机实际速度计算:* 公式:* 已知参数:*     车轮直径65mm,*     左边轮子一圈:360脉冲(RISING),*     右边轮子一圈:390脉冲(RISING),* 单位时间读两个轮子脉冲读取两个轮子脉冲* 采用M法测速:n=M0/(C*T0),* C为商家提供的单圈总脉冲数(商家提到的是直流电机主轴旋转一圈,在霍尔传感器每个引脚是有16个脉冲信号输出)* T0为自己设定的时间* M0为设定时间内的脉冲数(测量得)* n单位为圈/每秒(这里求得的是角速度,要乘以半径才等于电动推杆的速度,半径商家给的是10mm?)** 外部中断触发模式:*    LOW:低电平触发;*    CHANGE:电平变化触发;*    RISING :上升沿触发(由LOW变为HIGH);*    FALLING:下降沿触发(由HIGH变为LOW); *    HIGH:高电平触发(该中断模式仅适用于Arduino due);************************************/
void Read_Motor(){motor++;  //中断函数,读脉冲。感觉这里可以根据继续修改,即根据电平来判断是否加或者减。
}void Read_Motor_V(){unsigned long nowtime=0;motor=0;nowtime=millis()+50;//读50毫秒attachInterrupt(digitalPinToInterrupt(ENCODER_A),Read_Motor,RISING);(改为只触发上升沿)触发方式为CHANGE,表示电平变化就会触发,即上升沿和下降沿都触发,触发的中断函数为Read_Moto_L  。okwhile(millis()<nowtime); //达到50毫秒关闭中断okdetachInterrupt(digitalPinToInterrupt(ENCODER_A));//左轮脉冲关中断计数okV=((motor/16)*1*PI)/0.05;   //单位cm/s ok}/****实际控制函数****
*(1)计数器方向:商家给出的那一幅图的信息是:A相上升沿触发时,B相是低电平,跟A相下降沿触发时B是高电平是一个方向。将这种将count累计为正;
*(2)电机输出方向(控制电机转速方向的接线是正着接还是反着接)
*(3)PI 控制器 里面的误差(Basi)运算是目标值减当前值(Target-Encoder),还是当前值减目标值(Encoder-Target)
*三个方向只有对应上才会有效果否则你接上就是使劲的朝着一个方向(一般来说是反方向)满速旋转***/

这里如果仍然跟上述代码报相同的错误,那需要关闭应用程序重新打开进行编译一下。

编译成功!

六、拓展:MATLAB与Arduino连接及代码

由于自己的工作开展主要都是在Matlab上,因此在其上的工作会比较顺手,而且Matlab功能强大,算力强大,若将其与单片机结合起来,将能够实现更多的工作。

Arduino UNO控制带AB相磁通量式编码器电动推杆(测试阻尼)实录(L289N电机驱动)相关推荐

  1. Arduino、AB相增量式光电编码器测位移和速度方向

    利用Arduino.增量式光电编码器测量速度.方向.位移. 学校的一个项目作业,实测有效,若有改进的地方还需大佬们指点. 材料: Arduino mega 2560 2个2k电阻(红白之间2k,红绿之 ...

  2. 第二十七篇、基于Arduino uno,获取mlx90614非接触式红外测温传感器的温度值——结果导向

    0.结果 说明:先来看看串口调试助手显示的结果,第一个值是空气的温度,第二个值是被测量的物体温度,如果是你想要的,可以接着往下看. 1.外观 说明:虽然mlx90614非接触式红外测温传感器形态各异, ...

  3. 时间间隔感测试器(下):Arduino uno

    本文是上篇的延续,可以测量从LED亮到按下按钮的具体时长,并显示出来.但在功能增加的同时,占用的晶体管资源增加了多少呢?得到有效利用的又有多少呢? 目录 一.Arduino是什么? 二.部件 1.Ar ...

  4. STM32之增量式编码器电机测速

    STM32之增量式编码器电机测速 编码器 编码器种类 按监测原理分类 光电编码器 霍尔编码器 按输出信号分类 增量式编码器 绝对式编码器 编码器参数 分辨率 精度 最大响应频率 信号输出形式 编码器倍 ...

  5. arduino uno 掌控板实现数据上传到阿里云平台

    实验原理:arduino uno采集数据,通过UART接口发送数据到掌控板,掌控板连接阿里云,发送数据到阿里云. 硬件:arduino uno Mind+ 软件平台:arduino ide Mind+ ...

  6. 自学Arduino UNO串口(制造光控灯)

    一.Arduino串口介绍 串口用于不同设备间互相传输数据.比如,可以在电脑上实时输入指令,Arduino 板做出相应的反应,Arduino 板正在执行的工作也能实时反应在电脑上. 二.Arduino ...

  7. TB5128 + Arduino UNO,更方便控制步进电机

    关于TB5128 步进驱动芯片: 1. 概述     TB5128 是一种采用 PWM 斩波的两相双极步进电机驱动器.内置时钟解码器.     本驱动器采用 BiCD 工艺制造,额定输出为 50 V/ ...

  8. arduino uno + tb6600 + 42步进电机 自制自动绕线机

    自动绕线机 V1.0 记录分享一下,后续有需要会迭代新版本. 目录 自动绕线机 V1.0 1.  各组件介绍: 1.1  arduino uno :最简洁的控制板. 1.2  tb6600:步进电机控 ...

  9. Arduino uno循迹小车总结

    1.HW-096 4路循迹模块(红外发射器和红外接收器) 输出信号:TTL电平(可直接连接单片机I/0号,感应到传感器反射回来的红外光时,红指示灯亮,输出低电平:没有红外光时,指示灯不亮,输出高电平. ...

最新文章

  1. MyEclipse使用技巧小总结
  2. Spring 和 SpringBoot 最核心的 3 大区别,详解!
  3. 剑指offer-二叉树的深度(递归)
  4. sqlserver 安装共享功能什么意思_手表上的小表盘,大表盘是什么意思?它们可以带来哪些好玩的功能...
  5. 数学--数论--中国剩余定理+扩展中国剩余定理(孙子定理)
  6. MySQL入门之索引
  7. topaz全家桶中文_apache 开源项目全家桶 2020年12月中文介绍
  8. servlet详解及Tomcat中多线程下的Servlet(1)
  9. completion time, flow time和processing time 区别
  10. 条码软件如何设置十六进制并跳号打印
  11. 手机屏幕怎么计算机,怎么将手机屏幕投屏到电脑上
  12. 软件测试所需要掌握的技能
  13. TC118AH单通道内置MOS单通道直流无刷马达驱动IC
  14. 神器推荐:应用之星,零代码就能制作炫酷的H5页面
  15. 3.Navicat Premium:导入excel文件
  16. 支持十亿级密态数据、低代码,蚂蚁集团发布隐语开放平台
  17. 计算机10进制化2进制在线,二进制转十进制
  18. java swing桌面程序打包成.exe文件
  19. word里双横线怎么打_字体下方的双横线怎么弄 word蓝色双横线
  20. $(this) 自己、兄弟姐妹、长辈、长辈的兄弟姐妹增加/删除class

热门文章

  1. supervision
  2. x86架构学习笔记实模式
  3. JAVA SE 005——类型转换
  4. 如何在一台计算机上使用两个网络,电脑一拖二显示器怎么用?一台主机两个显示器的连接设置方法...
  5. Python:OpenCV4识别一个蓝色的圆并估算到相机的距离
  6. 隐马尔可夫模型之Baum-Welch算法详解
  7. 图像视觉保真度(VIF)评估-MATLAB代码与matlab-PyrTools-master工具包
  8. Cython入门:将python代码转为cython
  9. 网络信息安全模型概述
  10. Linux上安装dos2unix