你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 10692|回复: 24

[STM32F3] NUCLEO-STM32F303 之 GPIO模拟PWM(三)

  [复制链接]

76

主题

5715

回帖

4

蝴蝶豆

论坛元老

最后登录
2020-10-15
发表于 2015-6-4 23:30:12 | 显示全部楼层 |阅读模式
PWM说白了就是高低电平占不同比例的IO输出,GPIO就是可以设置成高低电平,所以用GPIO配合定时器也可以做到PWM的功能。
实验目的:
使用GPIO和定时器模拟周期为20ms,占空比为25%的PWM输出
电路图:
d10.jpg
实验代码:
  1. #include "mbed.h"

  2. Timeout timer;
  3. DigitalOut my_led(LED1);
  4. DigitalOut my_pwm(D10); //  pwm_io 函数使用的IO

  5. int on_delay = 0;
  6. int off_delay = 0;

  7. void toggleOff(void);

  8. void toggleOn(void) {
  9.     my_pwm = 1;//PB6输出高电平
  10.     //
  11.     timer.attach_us(toggleOff, on_delay);
  12. }

  13. void toggleOff(void) {
  14.     my_pwm = 0;//PB6输出低电平
  15.     timer.attach_us(toggleOn, off_delay);
  16. }

  17. // p_us = 信号周期,单位毫秒
  18. // dc   = 信号占空比 (0.0 to 1.0)
  19. void pwm_io(int p_us, float dc) {
  20.     timer.detach();
  21.     //周期、占空比为0直接输出低电平
  22.     if ((p_us == 0) || (dc == 0)) {
  23.         my_pwm = 0;
  24.         return;
  25.     }
  26.     //周期大于等1直接输出高电平
  27.     if (dc >= 1) {
  28.         my_pwm = 1;
  29.         return;
  30.     }
  31.     on_delay = (int)(p_us * dc);//计算高电平时间
  32.     off_delay = p_us - on_delay;//计算低电平时间
  33.     toggleOn();
  34. }

  35. int main() {

  36.     pwm_io(20000, 0.25); // 20ms - 25%

  37.     while(1) {
  38.         my_led = !my_led;
  39.         wait(0.5);
  40.     }
  41. }
复制代码
mbedTimeout对象主要用来在给定的时间后执行给定的函数
实验结果:
用Saleae logic采集的逻辑电平图如下:
QQ图片20150604230718.jpg


回复

使用道具 举报

47

主题

3404

回帖

30

蝴蝶豆

版主

最后登录
2020-12-7
发表于 2015-6-5 04:26:38 | 显示全部楼层
多谢分享
回复 支持 反对

使用道具 举报

107

主题

812

回帖

5

蝴蝶豆

论坛元老

最后登录
2019-8-28
发表于 2015-6-5 08:35:53 | 显示全部楼层
基于MBED的,不错,现在论坛这方面的资源还不多呵,欢迎继续分享
回复 支持 反对

使用道具 举报

8

主题

380

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-11-26
发表于 2015-6-5 09:09:48 | 显示全部楼层
很好,看看 了。
回复 支持 反对

使用道具 举报

27

主题

1709

回帖

42

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2015-6-5 09:20:26 | 显示全部楼层
还不如用硬件PWM。
回复 支持 反对

使用道具 举报

26

主题

48

回帖

0

蝴蝶豆

初级会员

最后登录
2015-6-19
发表于 2015-6-5 11:18:55 | 显示全部楼层
最新的金币已经奖励了!
回复 支持 反对

使用道具 举报

76

主题

5715

回帖

4

蝴蝶豆

论坛元老

最后登录
2020-10-15
 楼主| 发表于 2015-6-5 12:44:21 | 显示全部楼层
ts2000 发表于 2015-6-5 09:20
还不如用硬件PWM。

之所以模拟是为了学习。
回复 支持 反对

使用道具 举报

33

主题

1243

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-3-9
发表于 2015-6-5 12:54:45 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

12

主题

415

回帖

0

蝴蝶豆

高级会员

最后登录
2018-12-6
发表于 2015-6-5 13:56:03 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

2

主题

96

回帖

0

蝴蝶豆

初级会员

最后登录
2015-9-7
发表于 2015-6-5 14:54:22 | 显示全部楼层
怎么波形没有变化?
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版