在线时间434 小时
UID3066878
注册时间2014-12-11
NXP金币0
TA的每日心情 | 奋斗 2017-5-3 11:19 |
---|
签到天数: 10 天 连续签到: 1 天 [LV.3]偶尔看看II
金牌会员
 
- 积分
- 14090
- 最后登录
- 2024-4-19
|
首选感谢小七和社区,收到这块板子,研究了几天。和大家分享一下。这块板子和KL25Z差不多,所以可以在mbed下选择KL25Z模块使用了。
今天我们要使用这块板子,在mbed下使用RTOS做一个呼吸灯和使用ADC输入来控制一人LED灯的亮度,最后把ADC的输入值在 “串口”中打印出来,由于串口的一些特殊性,所以这里我换了windows记事本,没错就是在windows自带的记事本中输出调试信息。
电路:
实现思路:
RTOS下两个线程,利用PWM控制LED0,LED1,主函数里采集ADC的值。
实现代码:
话不多说,代码做了详细的注释,大家看吧。
- #include "mbed.h"
- #include "rtos.h"
- #include "USBKeyboard.h"
- //led线程信号
- #define LEDSIGNAL 0x55
- AnalogIn sw(PTE20);
- PwmOut led0(PTB18);
- PwmOut led1(PTB19);
- USBKeyboard key;
- int swValue,swOldValue;
- //led0工作线程,呼吸灯效果
- void led0Work(void const *argumnt)
- {
- int i;
- while(true)
- {
- for(i=0;i<=1000;i+=10)
- {
- //设置PWM脉宽
- led0.pulsewidth_us(i);
- //等待2ms
- Thread::wait(2);
- }
- Thread::wait(500);
- for(i=1000;i>0;i-=10)
- {
- led0.pulsewidth_us(i);
- Thread::wait(2);
- }
- }
- }
- //led1工作线程
- void led1Work(void const* argumnt)
- {
- while(true)
- {
- //等待信号触发
- Thread::signal_wait(LEDSIGNAL);
- int orgVal = *(int*)argumnt;
- int pVal = orgVal / 65500.0 * 1000;;
- //退格输出
- key.printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
- key.printf("Led Value:%5d",orgVal);
- //设置新的脉宽
- led1.pulsewidth_us(pVal);
- swOldValue = orgVal;
- }
- }
- int main()
- {
- //设置PWM周期
- led0.period_us(1000);
- led1.period_us(1000);
-
- Thread t1(led0Work);
- Thread t2(led1Work,&swValue);
-
- while(1)
- {
- swValue = sw.read_u16();
- //消除抖动
- if(abs(swOldValue - swValue)>65)
- t2.signal_set(LEDSIGNAL);
- wait(0.01);
- }
- }
复制代码
实验视频:
|
|