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

wm中文脉冲宽度调制,根据脉冲占空比的多少,也就是高电平占用时间多少、来传达信息的。

关于Arduino 使用软pwm的方法以及与上位机的通讯(带示例)_第1张图片

对于舵机和电调来说最低点是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 = 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);


}

上位机接收到的回传信息

关于Arduino 使用软pwm的方法以及与上位机的通讯(带示例)_第2张图片


你可能感兴趣的:(关于Arduino 使用软pwm的方法以及与上位机的通讯(带示例))