在线时间384 小时
UID3066878
ST金币0
蝴蝶豆4
注册时间2014-10-27
论坛元老
- 最后登录
- 2020-10-15
|
a0a.1 32b0c
PWM说白了就是高低电平占不同比例的IO输出,GPIO就是可以设置成高低电平,所以用GPIO配合定时器也可以做到PWM的功能。
实验目的:
使用GPIO和定时器模拟周期为20ms,占空比为25%的PWM输出
电路图:
实验代码:
- #include "mbed.h"
- Timeout timer;
- DigitalOut my_led(LED1);
- DigitalOut my_pwm(D10); // pwm_io 函数使用的IO
- int on_delay = 0;
- int off_delay = 0;
- void toggleOff(void);
- void toggleOn(void) {
- my_pwm = 1;//PB6输出高电平
- //
- timer.attach_us(toggleOff, on_delay);
- }
- void toggleOff(void) {
- my_pwm = 0;//PB6输出低电平
- timer.attach_us(toggleOn, off_delay);
- }
- // p_us = 信号周期,单位毫秒
- // dc = 信号占空比 (0.0 to 1.0)
- void pwm_io(int p_us, float dc) {
- timer.detach();
- //周期、占空比为0直接输出低电平
- if ((p_us == 0) || (dc == 0)) {
- my_pwm = 0;
- return;
- }
- //周期大于等1直接输出高电平
- if (dc >= 1) {
- my_pwm = 1;
- return;
- }
- on_delay = (int)(p_us * dc);//计算高电平时间
- off_delay = p_us - on_delay;//计算低电平时间
- toggleOn();
- }
- int main() {
- pwm_io(20000, 0.25); // 20ms - 25%
- while(1) {
- my_led = !my_led;
- wait(0.5);
- }
- }
复制代码 mbed的Timeout对象主要用来在给定的时间后执行给定的函数
实验结果:
用Saleae logic采集的逻辑电平图如下:
|
|