CyberHamster 发表于 2024-10-24 12:58:43

Ai8G1K08A输出3路8位PWM例程


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



#include <STC8G.H>
#include "define.h"
#include <intrins.h>
#include <absacc.h>
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#include <math.h>

#define                RXD                P30
#define                TXD                P31
#define                PO0                P32
#define                PO1                P33
#define                PO2                P54
#define                FOSC                27648000UL

void PWM_Out(unsigned char pwm_0,pwm_1,pwm_2)
{
        unsigned char temp;
       
        temp=PCA_PWM0&0xCD;                //读PCA_PWM0,XCCAP0H(PCA_PWM0)、EPC0H(PCA_PWM0)清零后赋值给temp
        if(pwm_0==0xFF)                        //如果pwm_0最大
                temp|=0x02;                        //设置EPC0H(PCA_PWM0)为1
        PCA_PWM0=temp;                        //写PCA_PWM0(先写高2位)
        CCAP0H=pwm_0;                        //写CCAP0H(再写低8位)
       
        temp=PCA_PWM1&0xCD;                //读PCA_PWM1,XCCAP1H(PCA_PWM2)、EPC1H(PCA_PWM1)清零后赋值给temp
        if(pwm_1==0xFF)                        //如果pwm_1最大
                temp|=0x02;                        //设置EPC1H(PCA_PWM1)为1
        PCA_PWM1=temp;                        //写PCA_PWM1(先写高2位)
        CCAP1H=pwm_1;                        //写CCAP1H(再写低8位)
       
        temp=PCA_PWM2&0xCD;                //读PCA_PWM2,XCCAP2H(PCA_PWM2)、EPC2H(PCA_PWM2)清零后赋值给temp
        if(pwm_2==0xFF)                        //如果pwm_2最大
                temp|=0x02;                        //设置EPC2H(PCA_PWM2)为1
        PCA_PWM2=temp;                        //写PCA_PWM2(先写高2位)
        CCAP2H=pwm_2;                                //写CCAP2H(再写低8位)
}

void Init(void)
{
        P_SW2|=EAXFR;
       
        P3M0=0x00;
        P3M1=0x00;
        P5M0=0x00;
        P5M1=0x00;
       
        CCON=0x00;                                //设置PCA控制寄存器
        CMOD=0x88;                                //设置空闲模式下PCA停止计数,禁止PCA计数器溢出中断,设置PCA时钟为系统时钟
        CL=0x00;                                //设置PCA计数器
        CH=0x00;                                //设置PCA计数器
        CCAPM0=PWM0;                        //使能PCA模块0PWM功能
        PCA_PWM0=0x00;                        //设置PCA模块0输出8位PWM
        CCAPM1=PWM1;                        //使能PCA模块1PWM功能
        PCA_PWM1=0x00;                        //设置PCA模块1输出8位PWM
        CCAPM2=PWM2;                        //使能PCA模块2PWM功能
        PCA_PWM2=0x00;                        //设置PCA模块2输出8位PWM
        CR=1;                                        //启动PCA
       
        EA=1;                                        //使能总中断
}

void main(void)
{
        Init();
        while(1)
        {
                PWM_Out(256/3,256/2,256/3*2);
                while(1);
        }
}

CyberHamster 发表于 2024-10-24 13:03:16

下载时设置时钟为27.648MHz



CyberHamster 发表于 2024-10-24 13:09:26

通过设置EPC0H(PCA_PWM0),极小值(0x00)或极大值(0xFF)时,波形是直线,不会出现关不死的情况

邮箱 发表于 2024-10-24 16:48:59

{:4_250:}

梁工 发表于 2024-10-24 21:23:56

不知道你要控制什么参数,如果仅仅是得到一个方波频率,则用定时器高速输出更方便。

CyberHamster 发表于 2024-10-25 12:41:19

梁工 发表于 2024-10-24 21:23
不知道你要控制什么参数,如果仅仅是得到一个方波频率,则用定时器高速输出更方便。 ...

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

梁工 发表于 2024-10-25 13:59:08

CyberHamster 发表于 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。

CyberHamster 发表于 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,已经正常工作了

lhuijiang 发表于 2025-6-4 17:46:18

nice
页: [1]
查看完整版本: Ai8G1K08A输出3路8位PWM例程