找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1239|回复: 13
打印 上一主题 下一主题
收起左侧

求STC8G1K08A SOP8单片机生成108KHZ的PWM

[复制链接]
跳转到指定楼层
楼主
ID:1146155 发表于 2025-9-24 22:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用PCA 或 定时器都行
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1133081 发表于 2025-9-25 07:28 | 只看该作者
stc-isp工具里有官方示例
回复

使用道具 举报

板凳
ID:879348 发表于 2025-9-25 08:20 | 只看该作者
降低颗粒度就行了,12/0.108=111,这个值赋给上限计数器,只是51终究还是性能差点,取不了整数,误差大了,也许设置一些奇怪的系统频率可以凑个整数
回复

使用道具 举报

地板
ID:712097 发表于 2025-9-25 10:22 | 只看该作者
  1. #include "reg51.h"
  2. #include "intrins.h"

  3. sfr     CCON    =   0xd8;
  4. sbit    CF      =   CCON^7;
  5. sbit    CR      =   CCON^6;
  6. sbit    CCF2    =   CCON^2;
  7. sbit    CCF1    =   CCON^1;
  8. sbit    CCF0    =   CCON^0;
  9. sfr     CMOD    =   0xd9;
  10. sfr     CL      =   0xe9;
  11. sfr     CH      =   0xf9;
  12. sfr     CCAPM0  =   0xda;
  13. sfr     CCAP0L  =   0xea;
  14. sfr     CCAP0H  =   0xfa;
  15. sfr     PCA_PWM0 =  0xf2;
  16. sfr     CCAPM1  =   0xdb;
  17. sfr     CCAP1L  =   0xeb;
  18. sfr     CCAP1H  =   0xfb;
  19. sfr     PCA_PWM1 =  0xf3;
  20. sfr     CCAPM2  =   0xdc;
  21. sfr     CCAP2L  =   0xec;
  22. sfr     CCAP2H  =   0xfc;
  23. sfr     PCA_PWM2 =  0xf4;

  24. sfr     P0M1    =   0x93;
  25. sfr     P0M0    =   0x94;
  26. sfr     P1M1    =   0x91;
  27. sfr     P1M0    =   0x92;
  28. sfr     P2M1    =   0x95;
  29. sfr     P2M0    =   0x96;
  30. sfr     P3M1    =   0xb1;
  31. sfr     P3M0    =   0xb2;
  32. sfr     P4M1    =   0xb3;
  33. sfr     P4M0    =   0xb4;
  34. sfr     P5M1    =   0xc9;
  35. sfr     P5M0    =   0xca;

  36. void main()
  37. {
  38.     P0M0 = 0x00;
  39.     P0M1 = 0x00;
  40.     P1M0 = 0x00;
  41.     P1M1 = 0x00;
  42.     P2M0 = 0x00;
  43.     P2M1 = 0x00;
  44.     P3M0 = 0x00;
  45.     P3M1 = 0x00;
  46.     P4M0 = 0x00;
  47.     P4M1 = 0x00;
  48.     P5M0 = 0x00;
  49.     P5M1 = 0x00;

  50.     CCON = 0x00;
  51.     CMOD = 0x08;                                //PCA时钟为系统时钟
  52.     CL = 0x00;
  53.     CH = 0x00;
  54. ////--7位PWM--
  55.     CCAPM0 = 0x42;                              //PCA模块0为PWM工作模式
  56.     PCA_PWM0 = 0x40;                            //PCA模块0输出6位PWM
  57.     CCAP0L = 0x20;                              //PWM占空比为75%[(80H-20H)/80H]
  58.     CCAP0H = 0x20;

  59.     CR = 1;                                     //启动PCA计时器

  60.     while (1);
  61. }

复制代码
回复

使用道具 举报

5#
ID:155507 发表于 2025-9-25 11:43 | 只看该作者
8G1K08A输出3路8位PWM例程
108 KHz PWM驱动5V雾化片

  1. //下载时设置时钟为27.648MHz
  2. #include <STC8G.H>
  3. #include "define.h"
  4. #include <intrins.h>
  5. #include <absacc.h>
  6. #include <string.h>
  7. #include <stdarg.h>
  8. #include <stdio.h>
  9. #include <math.h>

  10. #define                RXD                P30
  11. #define                TXD                P31
  12. #define                PO0                P32
  13. #define                PO1                P33
  14. #define                PO2                P54
  15. #define                FOSC                27648000UL

  16. void PWM_Out(unsigned char pwm_0,pwm_1,pwm_2)
  17. {
  18.         unsigned char temp;
  19.         
  20.         temp=PCA_PWM0&0xCD;                //读PCA_PWM0,XCCAP0H(PCA_PWM0[5:4])、EPC0H(PCA_PWM0[1])清零后赋值给temp
  21.         if(pwm_0==0xFF)                        //如果pwm_0最大
  22.                 temp|=0x02;                        //设置EPC0H(PCA_PWM0[1])为1
  23.         PCA_PWM0=temp;                        //写PCA_PWM0(先写高2位)
  24.         CCAP0H=pwm_0;                        //写CCAP0H(再写低8位)
  25.         
  26.         temp=PCA_PWM1&0xCD;                //读PCA_PWM1,XCCAP1H(PCA_PWM2[5:4])、EPC1H(PCA_PWM1[1])清零后赋值给temp
  27.         if(pwm_1==0xFF)                        //如果pwm_1最大
  28.                 temp|=0x02;                        //设置EPC1H(PCA_PWM1[1])为1
  29.         PCA_PWM1=temp;                        //写PCA_PWM1(先写高2位)
  30.         CCAP1H=pwm_1;                        //写CCAP1H(再写低8位)
  31.         
  32.         temp=PCA_PWM2&0xCD;                //读PCA_PWM2,XCCAP2H(PCA_PWM2[5:4])、EPC2H(PCA_PWM2[1])清零后赋值给temp
  33.         if(pwm_2==0xFF)                        //如果pwm_2最大
  34.                 temp|=0x02;                        //设置EPC2H(PCA_PWM2[1])为1
  35.         PCA_PWM2=temp;                        //写PCA_PWM2(先写高2位)
  36.         CCAP2H=pwm_2;                                //写CCAP2H(再写低8位)
  37. }

  38. void Init(void)
  39. {
  40.         P_SW2|=EAXFR;
  41.         
  42.         P3M0=0x00;
  43.         P3M1=0x00;
  44.         P5M0=0x00;
  45.         P5M1=0x00;
  46.         
  47.         CCON=0x00;                          //设置PCA控制寄存器
  48.         CMOD=0x88;                          //设置空闲模式下PCA停止计数,禁止PCA计数器溢出中断,设置PCA时钟为系统时钟
  49.         CL=0x00;                            //设置PCA计数器
  50.         CH=0x00;                            //设置PCA计数器
  51.         CCAPM0=PWM0;                        //使能PCA模块0PWM功能
  52.         PCA_PWM0=0x00;                      //设置PCA模块0输出8位PWM
  53.         CCAPM1=PWM1;                        //使能PCA模块1PWM功能
  54.         PCA_PWM1=0x00;                      //设置PCA模块1输出8位PWM
  55.         CCAPM2=PWM2;                        //使能PCA模块2PWM功能
  56.         PCA_PWM2=0x00;                      //设置PCA模块2输出8位PWM
  57.         CR=1;                               //启动PCA
  58.         
  59.         EA=1;                                        //使能总中断
  60. }

  61. void main(void)
  62. {
  63.         Init();
  64.         while(1)
  65.         {
  66.                 PWM_Out(256/3,256/2,256/3*2);
  67.                 while(1);
  68.         }
  69. }

复制代码
回复

使用道具 举报

6#
ID:1146155 发表于 2025-9-25 15:39 | 只看该作者
angmall 发表于 2025-9-25 11:43
8G1K08A输出3路8位PWM例程
108 KHz PWM驱动5V雾化片

Rebuild target 'Target 1'
compiling main.c...
main.c(3): warning C318: can't open file 'define.h'
main.c(43): error C202: 'EAXFR': undefined identifier
main.c(54): error C202: 'PWM0': undefined identifier
main.c(56): error C202: 'PWM1': undefined identifier
main.c(58): error C202: 'PWM2': undefined identifier
Target not created.
Build Time Elapsed:  00:00:00
回复

使用道具 举报

7#
ID:155507 发表于 2025-9-25 17:51 | 只看该作者
boos1234 发表于 2025-9-25 15:39
Rebuild target 'Target 1'
compiling main.c...
main.c(3): warning C318: can't open file 'define.h ...
  1. #ifndef __DEFINE_H__
  2. #define __DEFINE_H__

  3. #define SMOD        0x80
  4. #define SMOD0       0x40
  5. #define LVDF        0x20
  6. #define POF         0x10
  7. #define GF1         0x08
  8. #define GF0         0x04
  9. #define PD          0x02
  10. #define IDL         0x01
  11. #define T0x12       0x80
  12. #define T1x12       0x40
  13. #define UART_M0x6   0x20
  14. #define T2R         0x10
  15. #define T2_CT       0x08
  16. #define T2x12       0x04
  17. #define EXTRAM      0x02
  18. #define S1ST2       0x01
  19. #define TXLNRX      0x10
  20. #define EAXFR       0x80
  21. #define ET4         0x40
  22. #define ET3         0x20
  23. #define ES4         0x10
  24. #define ES3         0x08
  25. #define ET2         0x04
  26. #define ESPI        0x02
  27. #define ES2         0x01
  28. #define PI2C        0x40
  29. #define PCMP        0x20
  30. #define PX4         0x10
  31. #define PPWMFD      0x08
  32. #define PPWM        0x04
  33. #define PSPI        0x02
  34. #define PS2         0x01
  35. #define PPCAH       0x80
  36. #define PLVDH       0x40
  37. #define PADCH       0x20
  38. #define PSH         0x10
  39. #define PT1H        0x08
  40. #define PX1H        0x04
  41. #define PT0H        0x02
  42. #define PX0H        0x01
  43. #define PI2CH       0x40
  44. #define PCMPH       0x20
  45. #define PX4H        0x10
  46. #define PPWMFDH     0x08
  47. #define PPWMH       0x04
  48. #define PSPIH       0x02
  49. #define PS2H        0x01
  50. #define EX4         0x40
  51. #define EX3         0x20
  52. #define EX2         0x10
  53. #define T2CLKO      0x04
  54. #define T1CLKO      0x02
  55. #define T0CLKO      0x01
  56. #define INT4IF      0x40
  57. #define INT3IF      0x20
  58. #define INT2IF      0x10
  59. #define T4IF        0x04
  60. #define T3IF        0x02
  61. #define T2IF        0x01
  62. #define T1_GATE     0x80
  63. #define T1_CT       0x40
  64. #define T1_M1       0x20
  65. #define T1_M0       0x10
  66. #define T0_GATE     0x08
  67. #define T0_CT       0x04
  68. #define T0_M1       0x02
  69. #define T0_M0       0x01
  70. #define T4R         0x80
  71. #define T4_CT       0x40
  72. #define T4x12       0x20
  73. #define T4CLKO      0x10
  74. #define T3R         0x08
  75. #define T3_CT       0x04
  76. #define T3x12       0x02
  77. #define T3CLKO      0x01
  78. #define WKTEN       0x80
  79. #define WDT_FLAG    0x80
  80. #define EN_WDT      0x20
  81. #define CLR_WDT     0x10
  82. #define IDL_WDT     0x08
  83. #define S2SM0       0x80
  84. #define S2ST4       0x40
  85. #define S2SM2       0x20
  86. #define S2REN       0x10
  87. #define S2TB8       0x08
  88. #define S2RB8       0x04
  89. #define S2TI        0x02
  90. #define S2RI        0x01
  91. #define S3SM0       0x80
  92. #define S3ST4       0x40
  93. #define S3SM2       0x20
  94. #define S3REN       0x10
  95. #define S3TB8       0x08
  96. #define S3RB8       0x04
  97. #define S3TI        0x02
  98. #define S3RI        0x01
  99. #define S4SM0       0x80
  100. #define S4ST4       0x40
  101. #define S4SM2       0x20
  102. #define S4REN       0x10
  103. #define S4TB8       0x08
  104. #define S4RB8       0x04
  105. #define S4TI        0x02
  106. #define S4RI        0x01
  107. #define ADC_POWER   0x80
  108. #define ADC_START   0x40
  109. #define ADC_FLAG    0x20
  110. #define ADC_RESFMT  0x20
  111. #define SPIF        0x80
  112. #define WCOL        0x40
  113. #define SSIG        0x80
  114. #define SPEN        0x40
  115. #define DORD        0x20
  116. #define MSTR        0x10
  117. #define CPOL        0x08
  118. #define CPHA        0x04
  119. #define IAP_IDL     0x00
  120. #define IAP_READ    0x01
  121. #define IAP_WRITE   0x02
  122. #define IAP_ERASE   0x03
  123. #define IAPEN       0x80
  124. #define SWBS        0x40
  125. #define SWRST       0x20
  126. #define CMD_FAIL    0x10
  127. #define CMPEN       0x80
  128. #define CMPIF       0x40
  129. #define PIE         0x20
  130. #define NIE         0x10
  131. #define PIS         0x08
  132. #define NIS         0x04
  133. #define CMPOE       0x02
  134. #define CMPRES      0x01
  135. #define INVCMPO     0x80
  136. #define DISFLT      0x40
  137. #define CIDL        0x80
  138. #define ECF         0x01
  139. #define ECOM0       0x40
  140. #define CCAPP0      0x20
  141. #define CCAPN0      0x10
  142. #define MAT0        0x08
  143. #define TOG0        0x04
  144. #define PWM0        0x02
  145. #define ECCF0       0x01
  146. #define ECOM1       0x40
  147. #define CCAPP1      0x20
  148. #define CCAPN1      0x10
  149. #define MAT1        0x08
  150. #define TOG1        0x04
  151. #define PWM1        0x02
  152. #define ECCF1       0x01
  153. #define ECOM2       0x40
  154. #define CCAPP2      0x20
  155. #define CCAPN2      0x10
  156. #define MAT2        0x08
  157. #define TOG2        0x04
  158. #define PWM2        0x02
  159. #define ECCF2       0x01
  160. #define ECOM3       0x40
  161. #define CCAPP3      0x20
  162. #define CCAPN3      0x10
  163. #define MAT3        0x08
  164. #define TOG3        0x04
  165. #define PWM3        0x02
  166. #define ECCF3       0x01
  167. #define CBIF        0x80
  168. #define ETADC       0x40
  169. #define C7IF        0x80
  170. #define C6IF        0x40
  171. #define C5IF        0x20
  172. #define C4IF        0x10
  173. #define C3IF        0x08
  174. #define C2IF        0x04
  175. #define C1IF        0x02
  176. #define C0IF        0x01
  177. #define INVCMP      0x80
  178. #define INVIO       0x40
  179. #define ENFD        0x20
  180. #define FLTFLIO     0x10
  181. #define EFDI        0x08
  182. #define FDCMP       0x04
  183. #define FDIO        0x02
  184. #define FDIF        0x01
  185. #define ENPWM       0x80
  186. #define ECBI        0x40
  187. #define ENI2C       0x80
  188. #define MSSL        0x40
  189. #define EMSI        0x80
  190. #define MSBUSY      0x80
  191. #define MSIF        0x40
  192. #define MSACKI      0x02
  193. #define MSACKO      0x01
  194. #define ESTAI       0x40
  195. #define ERXI        0x20
  196. #define ETXI        0x10
  197. #define ESTOI       0x08
  198. #define SLRST       0x01
  199. #define SLBUSY      0x80
  200. #define STAIF       0x40
  201. #define RXIF        0x20
  202. #define TXIF        0x10
  203. #define STOIF       0x08
  204. #define TXING       0x04
  205. #define SLACKI      0x02
  206. #define SLACKO      0x01

  207. #endif
复制代码
回复

使用道具 举报

8#
ID:1034262 发表于 2025-9-26 16:57 | 只看该作者
你是要一个PWM还是要一个方波?
PWM:使用8位PWM,主频=0.108*256=27.648MHz,下载时输入这个频率。
方波:使用24MHz,用定时器0或1自动取反输出,1T模式,重装值=65536-111。
回复

使用道具 举报

9#
ID:1146155 发表于 2025-10-3 07:28 来自触屏版 | 只看该作者
angmall 发表于 2025-9-25 17:51

感谢大佬!!
回复

使用道具 举报

10#
ID:1146155 发表于 2025-10-3 07:29 来自触屏版 | 只看该作者
coody_sz 发表于 2025-9-26 16:57
你是要一个PWM还是要一个方波?
PWM:使用8位PWM,主频=0.108*256=27.648MHz,下载时输入这个频率。
方波 ...

好的 谢谢大佬
回复

使用道具 举报

11#
ID:1146155 发表于 2025-10-3 07:30 来自触屏版 | 只看该作者
wufa1986 发表于 2025-9-25 08:20
降低颗粒度就行了,12/0.108=111,这个值赋给上限计数器,只是51终究还是性能差点,取不了整数,误差大了, ...

谢谢大佬!!!
回复

使用道具 举报

12#
ID:1146155 发表于 2025-10-3 07:30 来自触屏版 | 只看该作者
WL0123 发表于 2025-9-25 07:28
stc-isp工具里有官方示例

的确!发现这个软件有实例
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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