ljh10503227 发表于 2025-4-2 15:54:34

求助:CCP/PWM 问题

芯片15W4K48S4   P2.6 输出可调PWM,系统时钟选择只能 是12分频修改后不工作。



经过测试 CMOD =0X00,CMOD=0X01,都是12分频, 其他数值不工作

神农鼎 发表于 2025-4-2 16:37:31





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


#include "reg51.h"
#include "intrins.h"

#define FOSC    11059200L

typedef unsigned char BYTE;
typedef unsigned int WORD;

sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;

sfr P_SW1       = 0xA2;             //外设功能切换寄存器1

#define CCP_S0 0x10               //P_SW1.4
#define CCP_S1 0x20               //P_SW1.5

sfr CCON      =   0xD8;         //PCA控制寄存器
sbit CCF0       =   CCON^0;         //PCA模块0中断标志
sbit CCF1       =   CCON^1;         //PCA模块1中断标志
sbit CR         =   CCON^6;         //PCA定时器运行控制位
sbit CF         =   CCON^7;         //PCA定时器溢出标志
sfr CMOD      =   0xD9;         //PCA模式寄存器
sfr CL          =   0xE9;         //PCA定时器低字节
sfr CH          =   0xF9;         //PCA定时器高字节
sfr CCAPM0      =   0xDA;         //PCA模块0模式寄存器
sfr CCAP0L      =   0xEA;         //PCA模块0捕获寄存器 LOW
sfr CCAP0H      =   0xFA;         //PCA模块0捕获寄存器 HIGH
sfr CCAPM1      =   0xDB;         //PCA模块1模式寄存器
sfr CCAP1L      =   0xEB;         //PCA模块1捕获寄存器 LOW
sfr CCAP1H      =   0xFB;         //PCA模块1捕获寄存器 HIGH
sfr CCAPM2      =   0xDC;         //PCA模块2模式寄存器
sfr CCAP2L      =   0xEC;         //PCA模块2捕获寄存器 LOW
sfr CCAP2H      =   0xFC;         //PCA模块2捕获寄存器 HIGH
sfr PCA_PWM0    =   0xf2;         //PCA模块0的PWM寄存器
sfr PCA_PWM1    =   0xf3;         //PCA模块1的PWM寄存器
sfr PCA_PWM2    =   0xf4;         //PCA模块2的PWM寄存器

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P6M0 = 0x00;
    P6M1 = 0x00;
    P7M0 = 0x00;
    P7M1 = 0x00;

    ACC = P_SW1;
    ACC &= ~(CCP_S0 | CCP_S1);      //CCP_S0=0 CCP_S1=0
    P_SW1 = ACC;                  //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)
   
//ACC = P_SW1;
//ACC &= ~(CCP_S0 | CCP_S1);      //CCP_S0=1 CCP_S1=0
//ACC |= CCP_S0;                  //(P3.4/ECI_2, P3.5/CCP0_2, P3.6/CCP1_2, P3.7/CCP2_2)
//P_SW1 = ACC;
//
//ACC = P_SW1;
//ACC &= ~(CCP_S0 | CCP_S1);      //CCP_S0=0 CCP_S1=1
//ACC |= CCP_S1;                  //(P2.4/ECI_3, P2.5/CCP0_3, P2.6/CCP1_3, P2.7/CCP2_3)
//P_SW1 = ACC;

    CCON = 0;                     //初始化PCA控制寄存器
                                    //PCA定时器停止
                                    //清除CF标志
                                    //清除模块中断标志
    CL = 0;                         //复位PCA寄存器
    CH = 0;
    CMOD = 0x02;                  //设置PCA时钟源
                                    //禁止PCA定时器溢出中断
    PCA_PWM0 = 0x00;                //PCA模块0工作于8位PWM
    CCAP0H = CCAP0L = 0x20;         //PWM0的占空比为87.5% ((100H-20H)/100H)
    CCAPM0 = 0x42;                  //PCA模块0为8位PWM模式

    PCA_PWM1 = 0x40;                //PCA模块1工作于7位PWM
    CCAP1H = CCAP1L = 0x20;         //PWM1的占空比为75% ((80H-20H)/80H)
    CCAPM1 = 0x42;                  //PCA模块1为7位PWM模式

    PCA_PWM2 = 0x80;                //PCA模块2工作于6位PWM
    CCAP2H = CCAP2L = 0x20;         //PWM2的占空比为50% ((40H-20H)/40H)
    CCAPM2 = 0x42;                  //PCA模块2为6位PWM模式

    CR = 1;                         //PCA定时器开始工作

    while (1);
}


神农鼎 发表于 2025-4-2 16:42:47



https://www.stcaimcu.com/data/download/Datasheet/STC15H2K64S4.pdf

这部分,可参考 STC15H2K64S4 的说明

梁工 发表于 2025-4-3 14:54:17

/*************        功能说明        **************
请先别修改程序,直接下载PCA-PWM.hex测试,下载时选择主频为24MHz。

STC15W4K60S4 2路10位PWM基本应用.

PWM0--P2.5输出10位PWM,频率为23437.5Hz.
PWM1--P2.6输出10位PWM,频率为23437.5Hz.
******************************************/

本例子使用1T时钟模式,用户可以修改下面的参数获得不同时钟:
CMOD= (CMOD& ~(7<<1)) | PCA_Clock_1T;        //选择时钟源, PCA_Clock_1T, PCA_Clock_2T, PCA_Clock_4T, PCA_Clock_6T, PCA_Clock_8T, PCA_Clock_12T, PCA_Clock_Timer0_OF






页: [1]
查看完整版本: 求助:CCP/PWM 问题