请选择 进入手机版 | 继续访问电脑版

930电子网

 找回密码
 立即注册
艾克姆科技推出最新产品STC8H8K64U开发板
查看: 2268|回复: 6

PWM如何输出固定频率的方波呢?

[复制链接]

2

主题

7

帖子

42

积分

新手上路

Rank: 1

积分
42
发表于 2020-12-7 08:55:57 | 显示全部楼层 |阅读模式
PWM如何输出固定频率的方波呢?
回复

使用道具 举报

101

主题

303

帖子

7109

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7109
发表于 2020-12-7 14:05:19 | 显示全部楼层
    1、艾克姆关于PWM提供的是呼吸灯的例子,换句话说,输出的PWM信号的占空比在不断变化,但频率是固定的。你只需要将main函数里面的改变占空比的变量赋值为常量即可。
    2、关于PWM实验在调试时,一定使用示波器或逻辑分析仪来辅助。
回复 支持 反对

使用道具 举报

2

主题

7

帖子

42

积分

新手上路

Rank: 1

积分
42
 楼主| 发表于 2020-12-9 16:28:12 | 显示全部楼层
谢谢回复。
有参考例程吗?比如我要产生一个1KHZ方波。
回复 支持 反对

使用道具 举报

101

主题

303

帖子

7109

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7109
发表于 2020-12-9 17:31:23 | 显示全部楼层
没有产生1KHZ的例程呢
回复 支持 反对

使用道具 举报

3

主题

12

帖子

1268

积分

金牌会员

Rank: 6Rank: 6

积分
1268
发表于 2020-12-10 20:43:24 | 显示全部楼层
我给你来个程序试试

  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ------------------------------------------------*/
  3. /* --- STC15Fxx 系列 输出任意周期和任意占空比的PWM实例-----------------*/
  4. /* --- Mobile: (86)13922805190 ----------------------------------------*/
  5. /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
  6. /* --- Tel: 86-0513-55012928,55012929,55012966-------------------------*/
  7. /* --- Web: www.STCMCU.com --------------------------------------------*/
  8. /* --- Web: www.GXWMCU.com --------------------------------------------*/
  9. /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序        */
  10. /* 如果要在文章中应用此代码,请在文章中注明使用了STC的资料及程序        */
  11. /*---------------------------------------------------------------------*/

  12. //本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
  13. //若无特别说明,工作频率一般为11.0592MHz


  14. #include "reg51.h"

  15. #define CYCLE   0x1000L     //定义PWM周期(最大值为32767)
  16. #define DUTY    50L         //定义占空比为50%

  17. #define PWMC        (*(unsigned int  volatile xdata *)0xfff0)
  18. #define PWMCH       (*(unsigned char volatile xdata *)0xfff0)
  19. #define PWMCL       (*(unsigned char volatile xdata *)0xfff1)
  20. #define PWMCKS      (*(unsigned char volatile xdata *)0xfff2)
  21. #define PWM2T1      (*(unsigned int  volatile xdata *)0xff00)
  22. #define PWM2T1H     (*(unsigned char volatile xdata *)0xff00)
  23. #define PWM2T1L     (*(unsigned char volatile xdata *)0xff01)
  24. #define PWM2T2      (*(unsigned int  volatile xdata *)0xff02)
  25. #define PWM2T2H     (*(unsigned char volatile xdata *)0xff02)
  26. #define PWM2T2L     (*(unsigned char volatile xdata *)0xff03)
  27. #define PWM2CR      (*(unsigned char volatile xdata *)0xff04)
  28. #define PWM3T1      (*(unsigned int  volatile xdata *)0xff10)
  29. #define PWM3T1H     (*(unsigned char volatile xdata *)0xff10)
  30. #define PWM3T1L     (*(unsigned char volatile xdata *)0xff11)
  31. #define PWM3T2      (*(unsigned int  volatile xdata *)0xff12)
  32. #define PWM3T2H     (*(unsigned char volatile xdata *)0xff12)
  33. #define PWM3T2L     (*(unsigned char volatile xdata *)0xff13)
  34. #define PWM3CR      (*(unsigned char volatile xdata *)0xff14)
  35. #define PWM4T1      (*(unsigned int  volatile xdata *)0xff20)
  36. #define PWM4T1H     (*(unsigned char volatile xdata *)0xff20)
  37. #define PWM4T1L     (*(unsigned char volatile xdata *)0xff21)
  38. #define PWM4T2      (*(unsigned int  volatile xdata *)0xff22)
  39. #define PWM4T2H     (*(unsigned char volatile xdata *)0xff22)
  40. #define PWM4T2L     (*(unsigned char volatile xdata *)0xff23)
  41. #define PWM4CR      (*(unsigned char volatile xdata *)0xff24)
  42. #define PWM5T1      (*(unsigned int  volatile xdata *)0xff30)
  43. #define PWM5T1H     (*(unsigned char volatile xdata *)0xff30)
  44. #define PWM5T1L     (*(unsigned char volatile xdata *)0xff31)
  45. #define PWM5T2      (*(unsigned int  volatile xdata *)0xff32)
  46. #define PWM5T2H     (*(unsigned char volatile xdata *)0xff32)
  47. #define PWM5T2L     (*(unsigned char volatile xdata *)0xff33)
  48. #define PWM5CR      (*(unsigned char volatile xdata *)0xff34)
  49. #define PWM6T1      (*(unsigned int  volatile xdata *)0xff40)
  50. #define PWM6T1H     (*(unsigned char volatile xdata *)0xff40)
  51. #define PWM6T1L     (*(unsigned char volatile xdata *)0xff41)
  52. #define PWM6T2      (*(unsigned int  volatile xdata *)0xff42)
  53. #define PWM6T2H     (*(unsigned char volatile xdata *)0xff42)
  54. #define PWM6T2L     (*(unsigned char volatile xdata *)0xff43)
  55. #define PWM6CR      (*(unsigned char volatile xdata *)0xff44)
  56. #define PWM7T1      (*(unsigned int  volatile xdata *)0xff50)
  57. #define PWM7T1H     (*(unsigned char volatile xdata *)0xff50)
  58. #define PWM7T1L     (*(unsigned char volatile xdata *)0xff51)
  59. #define PWM7T2      (*(unsigned int  volatile xdata *)0xff52)
  60. #define PWM7T2H     (*(unsigned char volatile xdata *)0xff52)
  61. #define PWM7T2L     (*(unsigned char volatile xdata *)0xff53)
  62. #define PWM7CR      (*(unsigned char volatile xdata *)0xff54)

  63. sfr PIN_SW2 =   0xba;

  64. sfr P0M1    =   0x93;
  65. sfr P0M0    =   0x94;
  66. sfr P1M1    =   0x91;
  67. sfr P1M0    =   0x92;
  68. sfr P2M1    =   0x95;
  69. sfr P2M0    =   0x96;
  70. sfr P3M1    =   0xb1;
  71. sfr P3M0    =   0xb2;
  72. sfr P4M1    =   0xb3;
  73. sfr P4M0    =   0xb4;
  74. sfr P5M1    =   0xC9;
  75. sfr P5M0    =   0xCA;
  76. sfr P6M1    =   0xCB;
  77. sfr P6M0    =   0xCC;
  78. sfr P7M1    =   0xE1;
  79. sfr P7M0    =   0xE2;

  80. sfr PWMCFG  =   0xf1;
  81. sfr PWMCR   =   0xf5;
  82. sfr PWMIF   =   0xf6;
  83. sfr PWMFDCR =   0xf7;

  84. void main()
  85. {
  86.     P0M0 = 0x00;
  87.     P0M1 = 0x00;
  88.     P1M0 = 0x00;
  89.     P1M1 = 0x00;
  90.     P2M0 = 0x00;
  91.     P2M1 = 0x00;
  92.     P3M0 = 0x00;
  93.     P3M1 = 0x00;
  94.     P4M0 = 0x00;
  95.     P4M1 = 0x00;
  96.     P5M0 = 0x00;
  97.     P5M1 = 0x00;
  98.     P6M0 = 0x00;
  99.     P6M1 = 0x00;
  100.     P7M0 = 0x00;
  101.     P7M1 = 0x00;

  102.     PIN_SW2 |= 0x80;                //使能访问XSFR
  103.     PWMCFG = 0x00;                  //配置PWM的输出初始电平为低电平
  104.     PWMCKS = 0x00;                  //选择PWM的时钟为Fosc/(0+1)
  105.     PWMC = CYCLE;                   //设置PWM周期
  106.     PWM2T1 = 0x0000;                //设置PWM2第1次反转的PWM计数
  107.     PWM2T2 = CYCLE * DUTY / 100;    //设置PWM2第2次反转的PWM计数
  108.                                     //占空比为(PWM2T2-PWM2T1)/PWMC
  109.     PWM2CR = 0x00;                  //选择PWM2输出到P3.7,不使能PWM2中断
  110.     PWMCR = 0x01;                   //使能PWM信号输出
  111.     PWMCR |= 0x80;                  //使能PWM模块
  112.     PIN_SW2 &= ~0x80;

  113.     while (1);
  114. }

复制代码

回复 支持 反对

使用道具 举报

2

主题

7

帖子

42

积分

新手上路

Rank: 1

积分
42
 楼主| 发表于 2020-12-14 09:23:46 | 显示全部楼层
正是河豚 发表于 2020-12-9 17:31
没有产生1KHZ的例程呢

有其它频率也行的,比如10K,100K都可以
回复 支持 反对

使用道具 举报

2

主题

7

帖子

42

积分

新手上路

Rank: 1

积分
42
 楼主| 发表于 2020-12-14 09:24:24 | 显示全部楼层
angmall 发表于 2020-12-10 20:43
我给你来个程序试试

谢谢,很给力呀
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|官方淘宝店|930电子网 ( 皖ICP备16000695号-2

GMT+8, 2021-1-18 13:08 , Processed in 0.145073 second(s), 22 queries .

Powered by Discuz! X3.2

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表