版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Arduino
编程控制与应用Arduino
智能控制的应用完成入门级线控底盘功能的实现在车辆行驶中电机的控制、舵机的控制、编码器计数、定速巡航等功能是不是听起来就很炫酷,今天我们就将会学习如何使用Arduino
来实现这些功能,来由自己编写出控制底盘的代码事件。导
入一
、电机转速控制二、电机转速的读取三、PID
控制基础知识目
录直流有刷电机主要由定子、转子、换向器等部件组成。如图所示。当整个电枢绕组即转子将按逆时针旋转,输入的直流电能就转换成转子轴上输出的机械能。直流有刷电机的好处是比较容易控制速度和方向。从转动开始的位置转到30°绕组①是S极,绕组②和③是N极通过磁极的吸引、排斥开始向右旋转从30°转到90°绕
组
③的极性反转绕组①和③是S
极,绕组②
是N极
继续向右旋转从90°转到120°绕组①的极性反转绕组②和③是N极,绕组③
是N
极
继续向右旋转因为条件跟开始位置一样,可以转动1圈旋转一、电机转速控制1
.直流有刷电机的组成旋转一般可以通过PWM(Pulsewidthmodulation,脉冲宽度调制)的方式来实现输出模拟信号的效果。Arduino输出的PWM
信
号频率固定(约490Hz)的方波,而通过改变信号每个周期高低电
平所占的比例(占空比),可以得到近似输出不同电压的效果,如图
所
示
。2.脉冲宽度调制(PWM)T75%25%1.25V时
间T-3.75V25%0时
间50%-2.5V时
间一、电机转速控制电
压
/
V电
压
/
V电
压
/
V75%50%直流有刷电机不宜在高温、易燃易爆等环境下使用,而且由于电机使用了电刷作为电流变换的部件,所以需要定期更换或清理接
触部位磨擦所产生的污物。3.直流有刷电机的维护一、电机转速控制一些常见的微型直流有刷电机如图所示。4.常见的微型直流有刷电机一、电机转速控制电机转速的读取,使用到了Arduino
的外部中断功能。如下图所示,中断函数的第1个参数是中断号,中断号为0时,表示使用2号管脚;中断号为1时,表示使用3号管脚。第2个参数是中断时被调用的子函数名,一般将中断时需要执行的指令都放在该子函数中。第3个参数是触发类型,一般有RISING、FALLING
和CHANGE。中断时被调用的函数名attachlnterrupt(0,slowDown,CHANGE)中断号
触发类型1.电机转速的读取二、电机转速的读取CHANGE时
间5VOV如下图所示,当检测到指定管脚的输入电动势从5V降到OV
时,属于FALLING条件;当检测到指定管脚的输入电动势从0V升到5V时,属于RISING条件;而CHANGE条件则是包含了上述两种条件。2.电机转速的读取条件二、电机转速的读取CHANGEFALLINGRISING实训套件中的直流电机尾部都安装了一个编码器模块,按要求连接好线束后,电机每旋转一圈,2号或3号管脚就会收到11个类似
上图的脉冲,通过计算单位时间内的脉冲个数就可以求得电机的旋
转速度。3.求取电机的旋转速度二、电机转速的读取将偏差的比例、积分和微分通过线性组合构成控制量,用该控制量对受控对象进行控制,称为PID算法,实际中也有P
、PI和
PD
控制算法。其中Kp、Ki、Kd
分别为比例系数、积分系数、微分
系数
。PID控制适用于温度、压力、流量、液位等几乎所有场合,不同场合仅仅是PID
参数应设置不同,只要参数设置得当均可以达到
很好的效果。(一
)PID控制概述三
、PID
控制基础知识比例系数Kp的作用:反应系统当前最基本的误差,能提高系统的动态响应速度;能迅速反映误差,从而减少误差,但是不能消除误差。比例系数Kp的调节:范围一般是:0.1--100。(1)如果增益值取0.1,PID
调节器输出变化为十分之一的偏差值(2)如果增益值取100
,PID
调节器输出变化为一百倍的偏差值。(3)初调时,选小一些,然后慢慢调大,直到系统波动足够小时
,再调节积分或微分系数。(二)各系数作用分析1.比例系数Kp
的作用及调节三
、
控制基础知识PID积分系数Ki的作用:反映系统的累积误差,理论上能消除系统稳态误差,提高无差度。积分系数Ki的调节:积分时间常数的定义是,偏差引起输出
增长的时间。(1)积分时间设为1秒,则输出变化100%所需时间为1秒。(2)初调时要把积分时间设置长些,然后慢慢调小直到系统
稳定为止。2.积分系数Ki的作用及调节(二)各系数作用分析三
、
控制基础知识PID微分系数Kd的作用:反应系统误差的变化率,具有预见性,们可以预见偏差的变化趋势,产生超前的控制效果。微分系数Kd
的调节:微分值是偏差值的变化率。如果通过比例、积分参数的调节还是收不到理想的控制要求,就可以调节微分
时间。初调时把这个系数设小,然后慢慢调大,直到系统稳定。3.微分系数Kd的作用(二)各系数作用分析三
、
控制基础知识PID任务实施Task
Implementation序号软件及硬件名称数量1Arduino
IDE/2联网的电脑1台/人3键盘1块/人4鼠标1块/人5Arduino控制开发套件1套/人6USB串口线1根/人(一)软件及硬件准备一、任务准备一、任务准备(二)场地设备准备任务实施前需要做好场地防护准备以及检查实训场地和设备设施是否及存在安全隐患,如不正常请汇报老师并进行处理方可实施任务。
(三)安全防护准备1
1.注意Arduino
控制开发套件与电脑的连接;2
2.注意连接端口的匹配;3
3.注意Arduino
控制开发套件的供电;4.注意使用含有库文件的程序时,检查Arduino
IDE中是否存在该库文件,4若无则要添加。步骤1:首先给Arduino
控制开发套件供上220v
电,通过旋钮使内部电源B输出的电压为12V左右,再将线控小车驱动板与电源B接通,最后将
连接线的方头端接口连接Arduino
UNO开发板,
另一端USB接口连接电脑。电压输出口连接220V电源舵机(一)控制电路连接旋钮连接12v电源开关二、实施步骤连接电脑电机(二)控制程序编写与上传◎
sketchjun21a|Arduino1.8.13文件编罐项目工具帮助当前编辑文档名称sketch
Jun21aS代码编写区域上传代码打开文件新建文档此处编译的时候有进度提示步骤1:打开Arduino
IDE软件,进入界面。二、实施步骤步骤2:在工具-端口-选择对应的端口。若分不清端口,先把开发板连接上,查看端口,有COM1
、COM3
、COM4
、COM5
、COM6;
断
开开发板连接,查看端口,有COM3、COM4、COM5
、COM6;少了一个COM10端口,那么
COM10就是对应的端口。(二)控制程序编写与上传串行端口COM10COM3COM4COM5COM6100io0端
口取得开发板信息编程器:"AVRISPmkll'烧录引导程序串行端口
COM3COM4COM5
COM60(13()ri000Fri000自动格式化项目存档修正编码并重新加载管理库…串口监视器串口绘图器WiFi101/WiFiNINA
Firmware开发板:'ArduinoUno'
端
口取得开发板信息编程器:"AVRISP
mkll"烧录引导程序二、实施步骤Ctrl+TCtrl+Shift+1Ctrl+Shift+MCtrl+Shift+LUpdater自动格式化项目存档修正编码并重新加载
管理库…串口监视器串口绘图器()
WiFi101/WiFiNINA
Firmware
Updaterri
开发板:'Arduino
Uno°Ctrl+TCtrl+Shift+lCtrl+Shift+MCtrl+Shift+L—102|Arduino
1.8.13旧工具帮助302IArduino
1.8.13
泪工具带助30)
(13步骤1:新建一个文档,//后的代号可删除;在【代码编写区域】中的输入如图所示代码。sketch_feb23a§1//定义整数型常量2const
int
motor_left=6;3
const
int
motor_left1=9;4
const
int
motor_right=10;
const
intmotor_right1=11;6//定义一个整数型变量并赋值
7int
PWM=150;//0-255
8//初始化函数10//loop
循环函数13void
loop(){141
5(三)电机的控制二、实施步骤步
骤
2:
在“void
setup(){”
的下方输入如图所示代码。sketch_feb23as4
constintmotor_right=10;//定义一个整数型变量并赋值intPWM=150;//0-2559
void
setup
()(10
//设置引脚的工作模式11
pinMode(motor_left,OUTPUT);12
pinMode(motor_left1,
OUTPUT);13
pinMode(motor_right,OUTPUT);
pinMode(motor_right1,OUTPUT);1
6
//1loop
循环函数17
voidloop()(18(三)电机的控制二、实施步骤步骤3:最后在
“void
loop(){”
的下方输入如图所示代码。16
//loop
循环函数17
void
loop(){18
//模拟输出1
9
analogwrite(motor_left,0);20
analogWrite(motor_left1,PWM);2
1
analogwrite(motor_right,0);22analogWrite(motor_right1,PWM);(三)电机的控制二、实施步骤步骤4:点击上传,如果操作顺利,就会显示上传成功,然后电机进行工作。可更改程序中PWM
的值(范围0-255)来改变电机的转速,达
到控制电机的效果。sketch_feb23aconst
int
motor_left=6;|const
int
motor_left1=9;const
int
motor_right=11;const
int
motor_right1=10;int
PWM=50;//0-255void
setup()(pinMode
(motor_left,OUTPUT);pinMode
(motor_left1,OUTPUT);pinMode
(motor_right,
OUTPUT);pinMode
(motor_right1,OUTPUT
);void
loop()(analogwrite(motor_
1eft,0);(三)电机的控制二、实施步骤步骤5:控制程序解析:分别定义四个整数型常量motor_left、motor_left1、motor_right、motor_right1并分别赋值为6/9/10/11。6/9控制小车左轮电机的正反转,10/11控制小车右轮电机
的正反转。定义一个整数型变量PWM
并赋值50,
该值代表电机转速的控制量,范围为0~255。(三)电机的控制定义常量表示
电机引脚号定义PWM
的
值为150将电机引脚配
置为输出模式电机引脚输入
PWM
值二、实施步骤setup函数loop
函
数步骤1:新建一个文档,//后的代号可删除;在【代码编写区域】中的输入如图所示代码。sketch_mar12as1//
常量定义3|constint
encoder_Right1=3;4|//易变型长整数变量定义5volatilelongencoder_Left,encoder_Right;7voidInitPin(){
//引脚模式设置pinMode(encoder_Left1,
INPUT);pinMode(encoder_Right1,INPUT);1112
//初始化函数13
void
setup
(){15}16//1oop
循环函数1819}(四)编码器计数的实现二、实施步骤步骤2:再输入如图所示代码。sketch_mar12a§1//
常量定义3
const
int
encoder_Right1=3;4//易变型长整数变量定义5
volatile
long
encoder_Left,encoder_Right;
6//
自定义函数void
InitPin()(
//引脚模式设置pinMode(encoder_Left1,
INPUT);pinMode(encoder_Right1,
INPUT);//布尔型变量定义boolean
R;//左轮服务中断函数encoder_Left++;//每一个中断加一//右轮服务中断函数encoder_Right++;//每一个中断加一22//初始化函数23void
setup(){(四)编码器计数的实现二、实施步骤步骤3:在
“voidsetup(){”
下方输入如图所示代码。sketch_mar12a§22|//初始化函数23void
setup(){Serial.begin(9600);//设直波特率InitPin();/
/调用该函数26
attachInterrupt(0,counter0,CHANGE
);
//启动0号中断27
attachInterrupt(1,counter1,CHANGE
);//
启动1号中断28
Serial.print(”请输入工(左轮)、R
(右轮)选择需要测量脉冲数的车轮");29
serial.println("
然后将此车轮转动一圈,最后输入'P′打印出脉冲数");
31//loop
循环函数32
void
loop(){3334}(四)编码器计数的实现二、实施步骤步骤4:最后在"void
loop(){“下方输入如图所示代码。Serial.println
("请选择需要测试的车轮L/R");encoder_Left=0;
//encoder_Left变量清零cmd
=0;//cmd
变量清零while(
cmd==
'R)
目
//当cmd
等于R时if(K){
//判断K是否为真Serial.println
("请转动右轮一圈"
);//串口打印提示信息K=false;
//R赋值为falsechar
R=Serial.read
();//
读取串口的数据并保存在变量R
中if
(R
==
'P'
){
//当R
的值等于p时Serial.print
("
右轮单圈脉冲数:");//在串口打印提示信息Serial.println
(encoder_Right);//
在串口打印编码值Serial.println
("请选择需要测试的车轮L/R"
);encoder_Right
=0;
//编码值清零cmd
=0;
//cmd
清零sketch_mar12as31//loop循环函数32voidloop()(35
while(cmd=='L'){//
当cmd
等于工时if(R){//判断K是否是真Serial.println("请转动左轮一圈");//在串口监视器打印提示信息K=false
;//K
赋值为falsecharL
=Serial.read
();//读取串口数据并保存在L变量中(四)编码器计数的实现二、实施步骤if
(L==
'P'){
//当工的值是P时Serial.print
(
"左轮单圈脉冲数:");Serial.printin
(encoder_Left);
t
=;S
.r
tru(值eaK赋ial/r/eruecmdKch//在串口打印提示信息二、实施步骤(四)编码器计数的实现步骤5:点击上传,如果操作顺利,就会显示上传成功,然后打开串口监视器,波特率选择9600,串口发送“L”是测试左轮,发送“R”是测试右轮。选择好测试的轮子后,将轮子
匀速转动一圈,然后串口发送“P”,
串口就会打印出轮子转动一圈的脉冲数。操作流程就是
:发送L或R——
然后转动轮子一圈——发送P。二
、实施步骤(四)编码器计数的实现步骤6:控制程序解析:(1)定义两个整数型常量encoder_Left1、encoder_Right1并分别赋值为2、3。定义两个易变变量encoder_Left、encoder_Right,定义一个布尔变量K。(2)在自定义函数InitPin
中设置encoder_Left1、encoder_Right1为输入模式。在初始
化函数中定义串口波特率为9600,调用自定义函数InitPin,
开启0、1号外部中断,触发方式为
电平发生变化,中断服务函数分别为counter0、counter1,
最后在串口监视窗口打印两行测试
方法提醒文本。(
3
)
在loop
函数中定义一个字符型变量cmd,读取串口监视器的值保存在cmd
中,将K赋
值为true,使用while
循环函数来判断cmd的值。二、实施步骤(四)编码器计数的实现定义变量程序运行流程图模
式读取串口的值
保存在cmd
中RK=?akse在串口监视器打印提示信息读取串口数据保存在R中R=P?
否在串口打印脉冲数读取串口数据保存在L中否L=P?是
在串口打印脉冲数cmd=?K=?调用引脚配置
函数,配置中断引脚为输入定义服务中断
函数在串口打印提
示信息在串口监视器
打印提示信息定义引脚模式
配置函数开启外部中断定义串口波特trueCCS_motorDrive
§1/*定义电机引脚*/2#define
motor_left
83#define
motor_left194
#define
motor_right105#definemotor_right111
6/*定义编码器引脚*/7
#define
encoderPinLeft28
fdefine
encoderPinRight
39/*定义左、右布尔值*/10#define
LEFT011#define
RIGHT
1
1
213
volatile
long
lasttime;//定义一个变量存储定时器上一次触发的时间14
int
leftBias,lastLeftBias,rightBias,lastRightBias;//
定义PID计算所需的偏差变量15
long
counterLeft,counterRight,leftEncoder,rightEncoder,pwmLeft,pumRight;//
定义左右计数器、编码器、脉冲对应的变量16
constint
timing
=30;//设置定时器的时间17
const
int
targetEncoder=80;//定义编码器目标变量并赋值18
const
float
Kp=0.8,Ki=0.3;//定义PID
计算所需的参数,Kp
为比例参数,ki
为积分参数步骤1:新建一个文档,//后的代号可删除;在【代码编写区域】中的
输入如图所示代码。(五)定速巡航的实现二、实施步骤步骤2:在
“void
setup(){”
下方输入如图所示代码。cCS_motorDrives1920
void
setup()(21
pinMode(encoderPinLeft,INPUT);22pinMode(encoderPinRight,INPUT);23attachInterrupt(0,encoderLeftISR,CHANGE);//开启0号外部中断,触发方式为电平变化24
attachInterrupt
(1,encoderRightISR,CHANGE);//开启1号外部中断,触发方式为电平变化25Serial.begin
(9600);26
pinMode(motor_left,OUTPUT);27
pinMode(motor_left1,OUTPUT);28
pinMode(motor_right,
OUTPUT);29
pinMode
(motor_right1,OUTPUT);
30}(五)定速巡航的实现二
、实施步骤步骤3:在“voidloop(){”
下方输入如图所示代码。CCS_motorDrive§31void
loop(){33
if(millis()-lasttime>timing){//
计时器34
lasttime=
millis
();//保存触发计时器的时间35
pwmPI();
/
/读取并打印测速值
3637}(五)定速巡航的实现二、实施步骤CCs_motorDrives//PI计算函数64
leftEncoder=readEncoder(LEFT);
//读取左编码器值66leftBias=targetEncoder-leftEncoder;//计算左编码器值与目标值的偏差
pwmLeft+=Kp*(leftBias
-lastLeftBias)+Ki*leftBias;//PI计算69
lastLeftBias=leftBias;
//保存左偏差值70pwmRight+=Kp*(rightBias-lastRightBias)+Ki*rightBias;//PI计算
motorDrive
(pwmLeft,pwmRight);
//调用电机驱动函数Serial.println(leftEncoder);75//Serial.print("rightEncoder
=");76
Seral.
print1n(rightEncoder);80
void
motorDrive(int
leftvel,int
rightvel)(//电机驱动函数leftVel=min(255,max(0,leftVe1));//若0≤leftVel≤255,则为实际值,大于255则为255,小于o则为0
rightVel=min(255,max(0,rightve1));digitalWrite
(motor_left
,LOW);analogwrite(
motor_left1,leftvel);digita1Write(motor_right,
LOW);analogwrite(motor_right1,rightvel);cCs_motorDives39
void
encoderLeftISR()(//
左轮中断服务函数41}42
void
encoderRightISR(){
//
右轮中断服务函数43counterRight
++;//每次中断自加1
44}46int
readEncoder(boolean
i)[//编码器值读取函数47
int
encVal=0;48if(i==LEFT)
{49
noInterrupts();encVal
=counterLeft;counterLeft=0;interrupts();54
else
(noInterrupts();encVal
=counterRight;counterRight=0;interrupts
();returnencval;61}步骤4:再输入如图所示的void
encoderLeftISR、void
encoderRightISR、int
readEncoder函
数代码,以及图所示的voidpwmPI、voidmotorDrive函数代码。(五)定速巡航的实现二、实施步骤步骤5:点击上传,如果操作顺利,就会显示上传成功,随后两个电机都进行工作,两后轮驱动
行驶,速度为设定的目标速度值(因各类误差影响
,速度值会维持在一定范围内有所波动)。(五)定速巡航的实现二、实施步骤二
、实施步骤(五)定速巡航的实现步骤6:控制程序解析(1)首先使用宏定义#define定义电机控制管脚和编码器管脚与Arduino
UNO板的对应关系。还
定义了左右轮的对应的布尔值,方便在程序中判断选择左右轮。(2)接着定义程序需要使用到的变量:包括触发时间、PID
相应偏差、计数器、编码器、脉冲宽
度、定时器时间、目标值和PID参数等变量。(3)进行初始化设置。首先设置编码器管脚模式并开启外部中断,接着设置串口通信波特率,设
置电机驱动控制管脚模式。(
4
)
在loop
函数中,使用if选择结构,每隔30ms
调用pwmPI
计算函数处理数据(同时驱动电机
转动),使电机保持设定的转速运行,车辆定速巡航。(5)定义程序需要使用到的子函数:包括左右轮中断服务函数、编码器值读取函数、PI
计算函数
和电机驱动函数。CCS_motorDrive1/*定义电机引脚*/2
*define
motor_left
83
#definemotor_left19
44definemotor_right
105
#define
motor_right1116/*定义编码器引脚*/9/*定义左、右布尔值*/13volatile
long
lasttime;//定义一个变量存储定时器上一次触发的时间14int
leftBias,lastLeftBias,rightBias,lastRightBias;//定义PID计算所需的偏差变量15|1ong
counterLeft,counterRight,leftEncoder,rightEncoder,pumLeft,pumRight;//
定义左右计数器、编码器、脉冲对应的变量
16
const
int
timing=30;//设置定时器的时间17const
inttargetEncoder
=80;/7定义编码器目标变量并赋值18
constfloatKp=0.8,Ki=0.3;//定义PID计算所需的参数,Kp为比例参数,Ri为积分参数20voidsetup((pinMode(encoderPinLeft,
INPUT);pinMode(encoderPinRight,
INPUT);attachInterrupt(0,encoderLeftISR,CHANGE);//开启0号外部中断,触发方式为电平变化attachInterrupt(1,encoderRightISR,CHANGE)
;//开启1号外部中断。触发方式为电平变化Sezial.begin(9600);pinMode
(motor_left,
OUTPUT);pinMode(motor_left1,
OUTPUT);pinMode(motor_right,OUTPUT);pinMode(motor_right1,
OUTPUT);void
encoderLeftISR()
//左轮中断服务函数counterLeft
++;
//
每次中断自加1void
encoderRightISRO{
//右轮中断服务函数counterRight
++;//每次中断自加1int
readEncoder(boolean
i)(//编码器值读取函数
int
encVal
=0;if(i==LEFT)(noInterrupts
();encVal
=counterLeft;counterLeft=0;interrupts();else(noInterrupts();encVal=counterRight;counterRight
=0;interrupts
();(五)定速巡航的实现void
1oop((if(millis()-lasttime>timing)(
//计时器
lasttime=millis
();//保存触发计时器的时间
pamPI();//读取并打印测速值二、实施步骤returneneVal;leftEncoder=readEncoder(LEFT);
//读取左编码器值rightEncoder=readEncoder(RIGHT);
//读取右编码器值leftBias
=targetEncoder
-leftEncoder;//计算左编码器值与目标值的偏差rightBias=targetEncoder-rightEncoder;//计算右编码器值与目标值的偏差pamLeftt=KP*(leftBias-1asteftBias)+Ki*leftBias;/PI计算pwmRight+=Rp*(rightBias-lastRightBias)+Ki*rightBias;//PI计算lastRightBias=rightBias;//保存右偏差值motorDrive(pwmLeft,pmRight);//调用电机驱动函数//serial.print("leftEncoder=");//serial.print1n(leftEncoder);//serial.print("rightEncoder=");Sezial
.print1n(rightEncoder);voidmotorDrive(intleftvel,intrightvel)(//电机驱动函数leftVel=min(255,max(0,leftVel));//若0≤leftVel≤255,则为实际值,大于255则为255,小于0则为0rightvel=
min(255,max
(0,rightvel));digita1Write(motor_left,LOW
);analogwrite(motor_left1,leftvel);digita1write
(motor_right
,
LOW);analogWrite(motor_right1,rightVel);readEncoder
函数定义变量
encVal
存储编码器值i=LEFT调用左中断服务函数encoderLeftlSR
读取左编码左计数器值清调用右中断服务函数encoderRightISR读取右编码器值右计数器值清(五)定速巡航的实现motorDrive
函数定义速度变量leftVel
和rightVel若0sleftVels255,则为实际值(即pwmLeft的
值
);
若leftVel<0,则为0;若leftVel
大于255,则为255。右电机同理控制电机输出对应转速定义控制管脚定义程序变量初始化设置时间间隔>30ms调用pwmPI
函数
(驱动车轮旋转并显示速度值)pwmPI
函数调用编码器值
读取函数readEncoder
读取编码器值计算偏差保存偏差值调用电机驱动函数motorDrive驱动车轮转动二
、实施步骤程序运行流程图串口监视器打印编码器值(速度值)步骤1:新建一个文档,//后的代号可删除;在【代码编写区域】中的输入如图所示代码。sketch_feb23a1
const
int
servopin=5;//舵机引脚int
myangle,pulsewidth;5void
servoRun(
int
myangle){//
舵机脉冲函数for
(int
i=0;i<=30;i++){pulsewidth=(myang
le*11)+500;//
将角度转化为500-2480的脉宽值digitalwrite
(servopin,HIGH
);//
将舵机接口电平至高delayMicroseconds
(pulsewidth);//延时脉宽值的微秒数10
digitalwrite
(servopin,LOW
);//将舵机接口电平至低1
1
delay
(20-pulsewidth/1000);
1214(六)舵机的控制二、实施步骤步骤2:分别在
“void
setup(){”
和
“voidloop(){”
的下方输入如图所示代码。sketch_feb23a§1const
int
servopin=5;//舵机引脚2int
myangle,pulsewidth;5void
servoRun(intmyangle)(//舵机脉冲函数for(inti=0;i<=30;i++){pulsewidth=(myangle*11)+500;//将角度转化为500-2480的脉宽值digitalWrite
(servopin,
HIG
H);//将舵机接口电平至高delayMicroseconds
(pulsewidth);//
延时脉宽值的微秒数1
0
digitalwrite(servopin,
LOW
);//
将舵机接口电平至低delay(20-pulsewidth/1000);voidsetup()(pinMode(servopin,OUTPUT);//
设置servopin为输出模式21void
loop(//putyourmain
code
here,to
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 劳务公司考试题库及答案
- 口腔护理考试题及答案
- 蓝绿色简约商务医疗答辩演示模板
- 货车运费考试题及答案
- 共性学法考试题及答案
- 港口运输考试题及答案
- 法纪教育考试题及答案
- 盾构机操作工岗前操作能力考核试卷含答案
- 印前处理和制作员安全知识宣贯水平考核试卷含答案
- AI医疗诊断辅助工具
- 矿产企业管理办法
- 2025秋季学期国开电大专本科《经济法学》期末纸质考试名词解释题库珍藏版
- 建筑设计防火规范-实施指南
- 2025国开《中国古代文学(下)》形考任务1234答案
- 肺部感染中医护理
- 租地合同协议书合同
- 《肺炎的CT表现》课件
- 粮食仓储设施建设维修资金申请报告
- 脑器质性精神障碍护理查房
- 中考英语听力命题研究与解题策略省公开课金奖全国赛课一等奖微课获奖课件
- 物联网智能家居设备智能控制手册
评论
0/150
提交评论