关于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);
}
上位机接收到的回传信息
对于舵机和电调来说最低点是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);
}
上位机接收到的回传信息
相关文章推荐
- objective-c中对象所有权的内存管理(关于set,get方法),以及如何使用@property来进行简易操作(九)
- 关于PHP模板Smarty的初级使用方法以及心得分享
- selenium+python关于登录的脚本代码,使用了读取excel以及向excel中写入测试结果的方法
- 关于oracle with table as 创建临时表的用法示例以及使用with as 的优点
- objective-c中对象所有权的内存管理(关于set,get方法),以及如何使用@property来进行简易操作
- Yii框架中CGridView的使用方法以及详细示例
- 关于ArrayList使用时常遇到的问题以及解决方法
- 关于new Function使用以及将json格式字符串转化为json对象方法介绍
- 关于ios的autoLayout的一些简单介绍以及使用方法
- IOS初学,关于内存的使用和释放,以及对其方法的理解
- linux中mv命令使用方法以及示例分析
- 关于本地存储构成数组以及jquery的inArray方法的使用
- Yii框架中CGridView的使用方法以及详细示例
- 关于ios的autoLayout的一些简单介绍以及使用方法
- 今日收获总结(关于存储过程时间查询的一些方法以及字段截取的函数及调用示例)
- 关于static关键字的使用以及与成员方法、成员属性的总结
- 关于C#Winform线程调用窗体的使用方法以及窗体的单一显示
- 关于VNC的控制原理以及安装使用方法
- Yii框架中CGridView的使用方法以及详细示例
- selenium+python关于登录的脚本代码,使用了读取excel以及向excel中写入测试结果的方法