您的位置:首页 > 产品设计 > UI/UE

关于Arduino 使用软pwm的方法以及与上位机的通讯(带示例)

2018-03-17 16:06 971 查看
wm中文脉冲宽度调制,根据脉冲占空比的多少,也就是高电平占用时间多少、来传达信息的。

对于舵机和电调来说最低点是920μs,中点1520μs,最高点2120μs(大部分舵机角度为正负60度).这也就是说要让某个舵机到达中点,只要在它信号线所在的针脚上发出1520μs的高电平即可,并且要确保高电平发出前后,所在针脚是处于低电平。 演示视频:点击打开链接上位机下载 :点击打开链接
下位机也就是arduino上函数大概就是这样/***********************软pwm**********************************/
void softpwm(int gpio, int pwm)//第一个参数是针脚,第二个是脉冲宽度
{
pwm = constrain(pwm, 920, 2120);//限制范围
digitalWrite(gpio, 0);
digitalWrite(gpio, 1);//上升沿
delayMicroseconds(pwm);//保持pwm μs
digitalWrite(gpio, 0);//下降沿
}或许有的人,知道模拟舵机是50hz,也就是周期20ms可为什么这个软pwm的执行时间最多只有2ms.我先给个结论,对于软pwm来说,在做下降沿后不需要另外再去延时。这是因为周期20ms指的是指舵机读取pwm信号的周期,而不是输出pwm的周期。在使用舵机时记得外接电源,手上这颗mg90s空载电流0.2a.这就是视频中示例的下位机的代码了,配合上位机软件就可以达到视频中的效果/*
Name: 下位机.ino
Created: 2018/3/7 16:25:22
Author: zanllp
*/

int pwm_0 = 1000;
int pwmpin;
// the setup function runs once when you press reset or power the board
void setup()
{
Serial.begin(9600);

}
// the loop function runs over and over again until power down or reset
/***********************软pwm**********************************/
void softpwm(int gpio, int pwm)
{
digitalWrite(gpio, 0);
pwm = constrain(pwm, 920, 2120);
digitalWrite(gpio, 1);
delayMicroseconds(pwm);
digitalWrite(gpio, 0);
}
/**********************解析出最后一个_后的数字***********************/
int analysis(String a)//
{
int i0;
String b = a;
a = "";
for (int i = 0; i < b.length(); i++) //找出最后一个'_'在哪
{
if (b[i] == '_')
{
i0 = i + 1;
}

}
for (int i = i0; i <b.length(); i++)//将最后一个'_'后的数字装进去
{
a += b[i];
}
return a.toInt();
}
/**********************读取串口发来的pwm指令************************/
void read_pwm()
{
softpwm(pwmpin, pwm_0);
if (Serial.available())
{
String temp = "";
temp = Serial.readString();

if (temp[0] == 'p'&& temp[1] == 'w' && temp[2] == 'm' && temp[3] == '_')
{
String pin = "";

if (temp[5] == '_')
{

pin = temp[4];

pwmpin = pin.toInt();
pwm_0 = analysis(temp);

}
else
{
pin += temp[4];
pin += temp[5];
pwmpin = pin.toInt();
pwm_0 = analysis(temp);
}
}

}
}
//*********************左右循环,测试舵机用*********************/
bool p;//记录舵机状态
void servo_test(int pin)
{
while (p)
{
pwm_0 += 10;
softpwm(pin, pwm_0);
if (pwm_0 >= 2120)
{
p = !p;
}
delay(30);
}
while (!p)
{
pwm_0 -= 10;
softpwm(pin, pwm_0);
if (pwm_0 <= 920)
{
p = !p;
}
delay(30);
}
}
/***************************************************************************/
void loop()
{
//servo_test(13);
read_pwm();

Serial.print(pwmpin);
Serial.print(" ");
Serial.println(pwm_0);

}
上位机接收到的回传信息
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PWM ARDUINO 舵机
相关文章推荐