PPM协议的输出实现
  cZH4bcBSsiCz 30天前 31 0

关于PPM输出的具体实现我们必然先知道其原理,本人是参考站内qiyuexin大佬的PPM 信号解析这篇文章。

基本要点

1.ppm每个通道所占用的时间并不固定
2.ppm的精度主要受制于时钟精度
3.对于一个通道数据每次开头都有0.5ms的固定低电平,之后跟着0.5ms的固定的高电平,之后是0 - 1ms的数据长度。也就是说每个数据之间没有固定的时间间隔,上一个数据结束后就是下一个通道的数据。
4.ppm一般10个控制通道,每帧的长度是固定的20ms。

具体实现

通过定时器产生一个10us的中断事件,在中断内进行计数,计数到2000即20ms代表已经完成1个数据帧。
pwm_count 0 -> 2000时表示计数了一个数据帧
这里笔者犹豫了一段时间,最后决定既然每个通道都有固定的0.5ms的固定低电平,和0.5ms的固定的高电平,那就直接把他做成一个固定的片段,在输出时候先进行此片段,之后紧跟着就是数据便可。于是我们创建了一个名为mod的变量,mod = 0时执行通道开头的0.ms低和0.5ms高,mod = 1时是数据。
对于数据,因为本身就在一个循环之中,只要一直if(count <= PPM_out[1])就可以,输出完一个通道之后cnt++,下一次循环输出的就是就是PPM_out[2]的数值了。
`

if (mod == 0)//开始信号
{
	if(count <= 50)	//0.5m 低电平表示通道起始信号
	{
		PPM_out_pin_reset;
	}
	else if(count > 50 && count <= 100)	//0.5m 高电平数据起始信号
	{
		PPM_out_pin_set;

	}
	else
	{
		count = 0;
		mod = 1;//进入数据时间
	}

}else if (mod == 1)
{
	if(count <= PPM_out[cnt])	//0.5m 低电平表示通道起始信号
	{
		PPM_out_pin_set;//数据
	}
	else
	{
		count = 0;
		mod = 0;//进入数据时间
		cnt ++;			
		if (cnt > 9)
		{
			mod = 2;
		}


	}
}

`

之后一直循环到数据都输出完成时,mod = 2来保持之后的高电平(引导或称结束脉冲),在循环到pwm_count = 2000,一帧完成之后对所有的计数器进行清零。

`

if(pwm_count==2000)//对计数进行复位
{
	pwm_count = 0;
	cnt = 0;
	mod = 0;

}

`
至此已经能输出正确的pwm信号了。

image

代码

点击查看代码
//2000 -> 20ms
//200  -> 2ms
//100  -> 1ms
//50   -> 0.5ms
//1    -> 0.01ms
u16 count=0;
u16 pwm_count=0;	//总计数 周期20ms,10us进次
unsigned char mod = 0;
unsigned char cnt = 0;

void PPM_loop(void)//1us进来1次
{

	pwm_count++;

	count++;
	if (mod == 0)//开始信号
	{
		if(count <= 50)	//0.5m 低电平表示通道起始信号
		{
			PPM_out_pin_reset;
		}
		else if(count > 50 && count <= 100)	//0.5m 高电平数据起始信号
		{
			PPM_out_pin_set;

		}
		else
		{
			count = 0;
			mod = 1;//进入数据时间
		}

	}else if (mod == 1)
	{
		if(count <= PPM_out[cnt])	//0.5m 低电平表示通道起始信号
		{
			PPM_out_pin_set;//数据
		}
		else
		{
			count = 0;
			mod = 0;//进入数据时间
			cnt ++;
			if (cnt > 9)
			{
				mod = 2;
			}

		}
	}

	if(pwm_count==2000)//对计数进行复位
	{
		pwm_count = 0;
		cnt = 0;
		mod = 0;

	}


}

//

写于最后,本人写的第一篇博客,嘶,感觉有点小难度,想表达清楚一件事难的许多,更何况本人如此孱弱的语言表达能力,写博客确实是一个很好的锻炼。立于兹,正是大一,我这几天一直辗转难眠,想到初中的玩伴一个个都如此优秀,而我三年之后却只是一个普通二本,再想到高中的玩伴也离我远去,只能说相遇注定要分开,大学生活确实丰富多彩,但是很遗憾的是热闹属于他人而我什么也没有。感觉与他们格格不入。在周围随处可见的是一对对情侣,对于春意懵懂的我来说确实造成了很多困恼,但是大学生活不至于对异性的向往,还有很多事情我要做的,比如嵌入式,fpga,Linux,很困恼。正如我日语转英语,学起来十分困难,或许这是某些异恋吧。大学是提升自己的地方,也是我准求我自己所想的一段时间,但我还在迷茫着。任何需要自制力的事情都是很难持续的。最后,之前在回宿舍的时候突然想到的一句话结尾吧,未与岁月署名亦不以岁月而自在。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 30天前 0

暂无评论

推荐阅读
  b1JyOKqvZbrx   10天前   17   0   0 嵌入式
  jEmNNF9D14iz   5天前   14   0   0 嵌入式
  jEmNNF9D14iz   3天前   11   0   0 嵌入式