找回密码
 立即注册
查看: 483|回复: 7

Ai8G1K08A输出3路8位PWM例程

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:156
  • 最近打卡:2025-04-29 00:51:09

24

主题

229

回帖

1281

积分

金牌会员

积分
1281
发表于 2024-10-24 12:58:43 | 显示全部楼层 |阅读模式

有网友需要使用Ai8G1K08A驱动超声波雾化片
该型号没有增强PWM,但是有PCA
可以使用PCA输出PWM

截图202410241250509059.jpg
截图202410241257019872.jpg
  1. #include <STC8G.H>
  2. #include "define.h"
  3. #include <intrins.h>
  4. #include <absacc.h>
  5. #include <string.h>
  6. #include <stdarg.h>
  7. #include <stdio.h>
  8. #include <math.h>
  9. #define                RXD                P30
  10. #define                TXD                P31
  11. #define                PO0                P32
  12. #define                PO1                P33
  13. #define                PO2                P54
  14. #define                FOSC                27648000UL
  15. void PWM_Out(unsigned char pwm_0,pwm_1,pwm_2)
  16. {
  17.         unsigned char temp;
  18.        
  19.         temp=PCA_PWM0&0xCD;                //读PCA_PWM0,XCCAP0H(PCA_PWM0[5:4])、EPC0H(PCA_PWM0[1])清零后赋值给temp
  20.         if(pwm_0==0xFF)                        //如果pwm_0最大
  21.                 temp|=0x02;                        //设置EPC0H(PCA_PWM0[1])为1
  22.         PCA_PWM0=temp;                        //写PCA_PWM0(先写高2位)
  23.         CCAP0H=pwm_0;                        //写CCAP0H(再写低8位)
  24.        
  25.         temp=PCA_PWM1&0xCD;                //读PCA_PWM1,XCCAP1H(PCA_PWM2[5:4])、EPC1H(PCA_PWM1[1])清零后赋值给temp
  26.         if(pwm_1==0xFF)                        //如果pwm_1最大
  27.                 temp|=0x02;                        //设置EPC1H(PCA_PWM1[1])为1
  28.         PCA_PWM1=temp;                        //写PCA_PWM1(先写高2位)
  29.         CCAP1H=pwm_1;                        //写CCAP1H(再写低8位)
  30.        
  31.         temp=PCA_PWM2&0xCD;                //读PCA_PWM2,XCCAP2H(PCA_PWM2[5:4])、EPC2H(PCA_PWM2[1])清零后赋值给temp
  32.         if(pwm_2==0xFF)                        //如果pwm_2最大
  33.                 temp|=0x02;                        //设置EPC2H(PCA_PWM2[1])为1
  34.         PCA_PWM2=temp;                        //写PCA_PWM2(先写高2位)
  35.         CCAP2H=pwm_2;                                //写CCAP2H(再写低8位)
  36. }
  37. void Init(void)
  38. {
  39.         P_SW2|=EAXFR;
  40.        
  41.         P3M0=0x00;
  42.         P3M1=0x00;
  43.         P5M0=0x00;
  44.         P5M1=0x00;
  45.        
  46.         CCON=0x00;                                //设置PCA控制寄存器
  47.         CMOD=0x88;                                //设置空闲模式下PCA停止计数,禁止PCA计数器溢出中断,设置PCA时钟为系统时钟
  48.         CL=0x00;                                //设置PCA计数器
  49.         CH=0x00;                                //设置PCA计数器
  50.         CCAPM0=PWM0;                        //使能PCA模块0PWM功能
  51.         PCA_PWM0=0x00;                        //设置PCA模块0输出8位PWM
  52.         CCAPM1=PWM1;                        //使能PCA模块1PWM功能
  53.         PCA_PWM1=0x00;                        //设置PCA模块1输出8位PWM
  54.         CCAPM2=PWM2;                        //使能PCA模块2PWM功能
  55.         PCA_PWM2=0x00;                        //设置PCA模块2输出8位PWM
  56.         CR=1;                                        //启动PCA
  57.        
  58.         EA=1;                                        //使能总中断
  59. }
  60. void main(void)
  61. {
  62.         Init();
  63.         while(1)
  64.         {
  65.                 PWM_Out(256/3,256/2,256/3*2);
  66.                 while(1);
  67.         }
  68. }
复制代码

Ai8G1K08A输出3路8位PWM.zip

9.04 KB, 下载次数: 66

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:156
  • 最近打卡:2025-04-29 00:51:09

24

主题

229

回帖

1281

积分

金牌会员

积分
1281
发表于 2024-10-24 13:03:16 | 显示全部楼层
下载时设置时钟为27.648MHz

截图202410241302512043.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:156
  • 最近打卡:2025-04-29 00:51:09

24

主题

229

回帖

1281

积分

金牌会员

积分
1281
发表于 2024-10-24 13:09:26 | 显示全部楼层
通过设置EPC0H(PCA_PWM0[1]),极小值(0x00)或极大值(0xFF)时,波形是直线,不会出现关不死的情况
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:239
  • 最近打卡:2025-05-02 03:42:37

22

主题

283

回帖

905

积分

高级会员

积分
905
发表于 2024-10-24 16:48:59 来自手机 | 显示全部楼层
REMOVEUNUSED
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12079
发表于 2024-10-24 21:23:56 | 显示全部楼层
不知道你要控制什么参数,如果仅仅是得到一个方波频率,则用定时器高速输出更方便。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:156
  • 最近打卡:2025-04-29 00:51:09

24

主题

229

回帖

1281

积分

金牌会员

积分
1281
发表于 2024-10-25 12:41:19 | 显示全部楼层
梁*** 发表于 2024-10-24 21:23
不知道你要控制什么参数,如果仅仅是得到一个方波频率,则用定时器高速输出更方便。 ...

网友说要PWM,可能占空比不是固定50%

点评

那就只能用PWM了,PCA的PWM的周期是固定6位、7位、8位、10位的,对应主频为: 6位PWM对应主频:6.912M 7位PWM对应主频:13.824M 8位PWM对应主频:27.648M 10位PWM需要110.592M,这个做不到了。 下载程序直接输入需要  详情 回复 发表于 2024-10-25 13:59
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12079
发表于 2024-10-25 13:59:08 | 显示全部楼层
CyberH*** 发表于 2024-10-25 12:41
网友说要PWM,可能占空比不是固定50%

那就只能用PWM了,PCA的PWM的周期是固定6位、7位、8位、10位的,对应主频为:
6位PWM对应主频:6.912M
7位PWM对应主频:13.824M
8位PWM对应主频:27.648M
10位PWM需要110.592M,这个做不到了。
下载程序直接输入需要的频率,建议使用8位PWM、27.648M。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:156
  • 最近打卡:2025-04-29 00:51:09

24

主题

229

回帖

1281

积分

金牌会员

积分
1281
发表于 2024-10-25 14:29:10 | 显示全部楼层
梁*** 发表于 2024-10-25 13:59
那就只能用PWM了,PCA的PWM的周期是固定6位、7位、8位、10位的,对应主频为:
6位PWM对应主频:6.912M
7 ...

是的,用的就是8位PWM,已经正常工作了
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 12:58 , Processed in 0.270374 second(s), 100 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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