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

  • Post author:
  • Post category:其他


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);


}

上位机接收到的回传信息



版权声明:本文为zanllp原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。