NUCLEO-STM32F303 之 GPIO模拟PWM(三)
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采集的逻辑电平图如下:
多谢分享 基于MBED的,不错,现在论坛这方面的资源还不多呵,欢迎继续分享 很好,看看 了。 还不如用硬件PWM。:L:L 最新的金币已经奖励了! ts2000 发表于 2015-6-5 09:20
还不如用硬件PWM。
之所以模拟是为了学习。 谢谢分享 谢谢分享 怎么波形没有变化?