如何写pwm程序(Thread嵌入式操作系统的PWM设备应用入门实例)
在文章开始前,作者先来简单介绍一下这款由中国开源社区所推出的一款嵌入式实时操作系统(RTOS),顾名思义,这是一款用于嵌入式设备的操作系统,它十分小巧方便,并且对国内外诸多开发板都有底层硬件的支持,方便初学者学习使用。而对于有开发能力的开发者来说,RT-Thread几乎支持所有主流微控制器,可以方便的进行移植开发(RT-Thread实时操作系统遵循Apache许可2.0),而且RT-Thread不仅仅只有这些,它方便的组件与软件包也实现了开发者们之间的开源共享,而RT-Thread特有的配置器也是将这一点展现的淋漓尽致。
RT-Thread嵌入式操作系统
本文所使用的开发平台是STM32F103与RT-Thread,所以如要运行本文的例程,请先查找RT-thread的Github项目中是否有您所使用的开发板的bsp,并将其下载到您的电脑上再进行编译测试,本文的编译环境为Keil5.
pwm概述我们即将创建一个会变换颜色的呼吸灯的程序,在编写程序之前作者先稍微讲解一下什么是PWM。
PWM的全称是Pulse Width Modulation,翻译过来就是脉冲宽度调制。
原理示意图
以上就是pwm的原理示意图。在T1这个时间段中属于高电平输出,在T2这个时间段中属于底电平输出。高电平在整个周期(T1 T2)中所占时间的比例就是占空比,通过对占空比的控制我们可以输出一段幅值相等的脉冲。
PWM控制亮度的原理
我们平时调节手机屏幕和灯的亮暗就是靠pwm的原理来进行控制的,通过对占空比的控制我们可以让led灯进行快速的闪烁,这个闪烁因为过快导致我们的肉眼根本无法识别出来,在不停的闪烁中如果灭的持续时间长那么我们就会觉得屏幕变暗了,如果亮的时间长我们就会觉得屏幕变亮了。
编程思路首先贴上本次要使用的RT-Thread库函数(本文不是标准的stm32库函数编译):
rt_device_find() rt_pwm_set() rt_pwm_enable() rt_pwm_disable()
函数描述
通过不停对占空比进行有序的改变可以让灯的亮度由暗变亮再让灯由亮变暗,有两种方法可以完成这种操作,一个是使用for或者while循环,一个就是使用数组,在接下来的实例中我们是使用数组进行有序控制的。
代码首先在这儿声明一下,这里使用的开发板以低电平输出亮,高电平输出暗,开发板中关于led的原理图如下:
LED
当您想要编译测试本例程时,请先查找您购买的开发板中关于LED灯的原理图,并对例程中的引脚定义进行更换。
#include <rtthread.h> #include <rtdevice.h> #include <board.h> #define pwm "pwm3" int jun[300];//声明数组 int a=0; /* 将占空比的值赋给数组 */ void pwm_sat8(){ for(int i=100000;i>=0;i=i-1000){ jun[a]=i; a ; } for(int i=0;i<=100000;i=i 1000){ jun[a]=i; a ; } a=0; struct rt_device_pwm *pwm_dev;//设备句柄 pwm_dev = (struct rt_device_pwm *)rt_device_find(pwm);//查找设备 /* 完成红、绿、蓝亮度的依次变化 */ while(1){ for(a=0;a<=201;a ){ rt_pwm_set(pwm_dev,2,100000,jun[a]); rt_pwm_enable(pwm_dev,2); rt_thread_mdelay(20); } for(a=0;a<=201;a ){ rt_pwm_set(pwm_dev,3,100000,jun[a]); rt_pwm_enable(pwm_dev,3); rt_thread_mdelay(20); } for(a=0;a<=201;a ){ rt_pwm_set(pwm_dev,4,100000,jun[a]); rt_pwm_enable(pwm_dev,4); rt_thread_mdelay(20); } } } MSH_CMD_EXPORT(pwm_sat8, this is a pwm)
首先,我们定义了一个名字为jun,大小为300的数组。
我们在这里设置的周期是100000纳秒(也就是0.1ms),因为亮度的大小范围是0%——100%,所以我们将占空比从100000,每次以减1000的方式赋值给数组,再从0,以每次加1000的方式赋值给数组,这样子我们就得到了{100000,99000,98000…98000,99000,100000}的数组。
接着使用rt_device_find()获取设备句柄,在获取设备句柄之前我们可以看到有这么一行代码:
struct rt_device_pwm *pwm_dev;
这行代码我们先创建了一个结构体,并给这个结构体设置了一个指针。
因为rt_device_find()返回的是一个句柄所以我们要先强制类型转换,然后才能把返回的句柄赋给指针。
while(1){ for(a=0;a<=201;a ){ rt_pwm_set(pwm_dev,2,100000,jun[a]); rt_pwm_enable(pwm_dev,2); rt_thread_mdelay(20); } for(a=0;a<=201;a ){ rt_pwm_set(pwm_dev,3,100000,jun[a]); rt_pwm_enable(pwm_dev,3); rt_thread_mdelay(20); } for(a=0;a<=201;a ){ rt_pwm_set(pwm_dev,4,100000,jun[a]); rt_pwm_enable(pwm_dev,4); rt_thread_mdelay(20); } } }
以上代码就是实现交替变换颜色并且安照顺序调节亮度的代码。我们抽取第一段分析一下:
代码
通过rt_pwm_set()可以设置我们需要使用的pwm设备和需要使用的通道(不理解什么是RGB通道?看看我刚发的led原理图),然后设置周期为100000,最后设置占空比,在上文中我们已经讲过我们是使用数组进行占空比设置的,所以设置为jun[a],通过for循环中的判断和更新变量来完成占空比从100000到0再从0到100000的变化。
在设置pwm设备后我们要使能pwm设备,最后加上延时函数rt_thread_mdelay(),这里我们设置延时为0.02毫秒。
*注意因为作者这次使用的开发板是以低电平为输出led亮的,所以当你使用env工具配置好pwm设备后它会默认亮起来,为了解决这个问题我们可以在mian()函数中编写如下代码:
代码
这样子我们就能在系统运行开始的时候把它给关闭了。
分享到这就结束了哦~
本文的PWM应用示例分享就到这里为止了,感兴趣的读者可以关注作者哦。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com