首选感谢小七和社区,收到这块板子,研究了几天。和大家分享一下。这块板子和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);
}
}
|