iyxectrx 发表于 2025-3-4 16:01:34

8H1K08-TSSOP16怎么使用8G1K08A的pca功能

8H1K08-TSSOP16怎么使用8G1K08A的pca类似的功能?

使用IC:8H1K08-TSSOP16
输出引脚P12
需求:初始化固定频率,12M自带内部晶振。输出3K-10K的pwm,占空比根据采集的数据输出0%-100%实时更新,从P12引脚输出。
为满足这个需求,参考那个例程比较好实现,或者通过哪个pwm功能可以实现。
(排除定时器计时,高频不稳)

国芯人工智能 发表于 2025-3-4 16:03:00

STC8H1K08-TSSOP16虽然不具备STC8G1K08A的PCA功能,但可以通过其内置的PWM模块实现类似需求。建议使用定时器2(Timer2)结合PWM功能,配置步骤如下:

1. **时钟配置**:选择12MHz内部晶振作为系统时钟源。
2. **PWM频率设置**:根据需求(3K-10K),设置Timer2的自动重装载值(ARR)和预分频器(PSC),以生成目标频率。
3. **占空比控制**:通过修改比较寄存器(CCR)的值,实时调整占空比(0%-100%)。
4. **引脚配置**:将P12引脚配置为PWM输出模式。

参考STC8H1K08的PWM例程,初始化代码可基于手册中的寄存器配置,确保PWM输出稳定且占空比可动态调整。此方案无需依赖PCA模块,且能高效实现需求。

[本文内容由国芯人工智能辅助生成,仅供参考]

国芯人工智能 发表于 2025-3-4 16:08:00

STC8H1K08-TSSOP16与STC8G1K08A的PCA功能类似,可通过配置PCA模块实现PWM输出。首先,初始化PCA模块,选择12MHz内部晶振作为时钟源。配置PCA模式为PWM模式,设置PWM频率范围为3K-10KHz,具体频率可通过调整PCA时钟分频和计数周期实现。P12引脚作为PWM输出引脚,需配置相应的I/O模式。通过实时更新PCA捕获寄存器的值,可动态调整占空比(0%-100%)。建议参考STC官方提供的PCA例程,特别是PWM输出相关的代码段,以确保配置正确。排除定时器计时问题,PCA模块的硬件PWM输出更加稳定,适合高频应用。

[本文内容由国芯人工智能辅助生成,仅供参考]

AI芯 发表于 2025-3-4 16:15:31

8H1K08无PCA

iyxectrx 发表于 2025-3-4 16:20:48

AI芯 发表于 2025-3-4 16:15
8H1K08无PCA

那我要达到我得需求,可以怎么实现呢?

DebugLab 发表于 2025-3-4 16:41:55

iyxectrx 发表于 2025-3-4 16:20
那我要达到我得需求,可以怎么实现呢?
用16位高级PWM,P12是PWM2P,属于PWMA
初始化先使用PWMA_PS设置脚位,然后写CCMRx前必须先清零CCxE关闭通道(PWMA_CCER1=0x00),再写PWMA_CCMR1设置模式和输出使能和极性,再写PWMA_ARR设置周期时间(根据PWM输入时钟和需要的频率计算),再写PWMA_ENO使能输出,再打开PWMA_BKR的最高位MOEA主输出使能,最后打开PWMA_CR1的CNEA位使能计数器
占空比使用PWMA_CCR1动态设置
初始化:
      P_SW2|=EAXFR;
      
      P0M1=0x00;      P0M0=0x00;      //设置IO模式
      P1M1=0x00;      P1M0=0x00;      //设置IO模式
      P2M1=0x00;      P2M0=0x00;      //设置IO模式
      P3M1=0x03;      P3M0=0x00;      //设置IO模式
      P4M1=0x00;      P4M0=0x00;      //设置IO模式
      P5M1=0x00;      P5M0=0x00;      //设置IO模式
      P6M1=0x00;      P6M0=0x00;      //设置IO模式
      P7M1=0x00;      P7M0=0x00;      //设置IO模式
      
      PWMA_CCER1 = 0x00;      //写 CCMRx 前必须先清零 CCxE 关闭通道
      PWMA_CCMR1 = 0x60;      //通道模式配置
      PWMA_CCER1 = 0x10;      //配置通道输出使能和极性
      
      PWMA_ARRH=(unsigned char)(arr>>8); //设置周期时间
      PWMA_ARRL=(unsigned char)arr;
      
      PWMA_ENO=0x00;
      PWMA_ENO|=0x04;                //使能输出
      
      PWMA_BKR=0x80;                //使能主输出
      PWMA_CR1|=0x01;                //开始计时设置占空比:
      PWMA_CCR1H = (unsigned char)(duty >> 8); //设置占空比时间
      PWMA_CCR1L = (unsigned char)(duty);

iyxectrx 发表于 2025-3-4 21:31:38

DebugLab 发表于 2025-3-4 16:41
用16位高级PWM,P12是PWM2P,属于PWMA
初始化先使用PWMA_PS设置脚位,然后写CCMRx前必须先清零CCxE关闭通 ...

如果我目前先让P12输出恒定的PWM这个程序是不是可以输出


#include "stc8h.h"
#include "intrins.h"
void main()
{
    P1M1=0xF1;//P10AD高阻 P11-13 推挽P14-17高阻 1111 0001
                P1M0=0x0E;//0000 1110
       
               
                P3M1 = 0xCC; //P37 p36开漏P35 p34推挽p33 P32开漏P31 30双向    1100 1100
                P3M0 = 0xFC;//1111 1100
       
                P5M1 = 0x10;//p54高阻
                P5M0 = 0x00;

    P_SW2 = 0x80;
    PWMA_CCER1 = 0x00;                        //写CCMRx前必须先清零CCERx关闭通道
    PWMA_CCMR1 = 0x60;                        //设置CC1为PWMA输出模式
    PWMA_CCER1 = 0x10;                        //使能CC1通道
    PWMA_CCR1 = 100;                            //设置占空比时间
    PWMA_ARR = 500;                           //设置周期时间
    PWMA_ENO = 0x04;                            //使能PWM1P端口输出
    PWMA_BKR = 0x80;                            //使能主输出
    PWMA_CR1 = 0x01;                            //开始计时

    while (1);
}

iyxectrx 发表于 2025-3-5 10:05:34

#include "stc8h.h"
#include "intrins.h"
void main()
{
    P1M1=0xF1;//P10AD高阻 P11-13 推挽P14-17高阻 1111 0001
                P1M0=0x0E;//0000 1110
       
               
                P3M1 = 0xCC; //P37 p36开漏P35 p34推挽p33 P32开漏P31 30双向    1100 1100
                P3M0 = 0xFC;//1111 1100
       
                P5M1 = 0x10;//p54高阻
                P5M0 = 0x00;

    P_SW2 = 0x80;
    PWMA_CCER1 = 0x00;                        //写CCMRx前必须先清零CCERx关闭通道
    PWMA_CCMR1 = 0x60;                        //设置CC1为PWMA输出模式
    PWMA_CCER1 = 0x10;                        //使能CC1通道
    PWMA_CCR1 = 100;                            //设置占空比时间
    PWMA_ARR = 500;                           //设置周期时间
    PWMA_ENO = 0x04;                            //使能PWM1P端口输出
    PWMA_BKR = 0x80;                            //使能主输出
    PWMA_CR1 = 0x01;                            //开始计时

    while (1);
}

如果我目前先让P12输出恒定的PWM,这个程序是不是可以正确输出

DebugLab 发表于 2025-3-5 12:39:30

iyxectrx 发表于 2025-3-5 10:05
如果我目前先让P12输出恒定的PWM,这个程序是不是可以正确输出

P12输出5KHz 50% PWM程序,供参考
#include <AI8H.H>
      
#define                FOSC                        12000000UL                                        //主时钟

void Init(void)
{
      P_SW2|=EAXFR;
      
      P0M1=0x00;      P0M0=0x00;      //设置IO模式
      P1M1=0x00;      P1M0=0x00;      //设置IO模式
      P2M1=0x00;      P2M0=0x00;      //设置IO模式
      P3M1=0x03;      P3M0=0x00;      //设置IO模式
      P4M1=0x00;      P4M0=0x00;      //设置IO模式
      P5M1=0x00;      P5M0=0x00;      //设置IO模式
      P6M1=0x00;      P6M0=0x00;      //设置IO模式
      P7M1=0x00;      P7M0=0x00;      //设置IO模式
      
      PWMA_PS=0x00;                        //高级 PWM 通道输出脚选择位
      
      PWMA_CCER1=0x00;                //写 CCMRx 前必须先清零 CCxE 关闭通道
      PWMA_CCMR2=0x60;                //通道模式配置
      PWMA_CCER1=0x10;                //配置通道输出使能和极性
      
      PWMA_ARRH=(unsigned char)(2400>>8); //设置周期时间
      PWMA_ARRL=(unsigned char)2400;
      
      PWMA_ENO=0x00;
      PWMA_ENO|=0x04;                        //使能输出
      
      PWMA_BKR=0x80;                        //使能主输出
      PWMA_CR1|=0x01;                        //开始计时
      
      EA=1;                                        //启用总中断
}

void main(void)
{
      Init();
      PWMA_CCR2H=(unsigned char)(1200 >> 8); //设置占空比时间
      PWMA_CCR2L=(unsigned char)(1200);
      while(1)
      {
               
      }
}

iyxectrx 发表于 2025-4-7 10:34:04

void PWM_init()
{
    P_SW2 = 0x80;
                PWMA_PS=0x00;                        //高级 PWM 通道输出脚选择位
    PWMA_CCER1 = 0x00;                        //写CCMRx前必须先清零CCERx关闭通道
    PWMA_CCMR1 = 0x60;                        //设置CC1为PWMA输出模式
    PWMA_CCER1 = 0x01;                        //使能CC1通道
    PWMA_CCR1 = 5;                            //设置占空比时间
    PWMA_ARR = 60000;                           //设置周期时间
    PWMA_ENO = 0x02;
    PWMA_BKR = 0x80;                            //使能主输出
    PWMA_CR1|=0x01;                        //开始计时
}

STC8H1K08-TSSOP20使用P11输出下面的程序是否正确
页: [1]
查看完整版本: 8H1K08-TSSOP16怎么使用8G1K08A的pca功能