- 打卡等级:常住居民III
- 打卡总天数:158
- 最近打卡:2026-04-28 06:55:25
已绑定手机
中级会员
- 积分
- 371
|
- #include "STC8Hxxx.h"
- #include "intrins.h" // Keil 内部函数头文件
-
- #define MAIN_Fosc 11059200L // 定义主时钟
-
- #define PWM1_1 0x00 // P:P1.0 N:P1.1
- #define PWM3_1 0x00 // P:P1.4 N:P1.5
-
- u16 PWM_PERIOD = 0; // PWM周期
-
- // PWMA配置--充电PWM
- void PWMA_config(void)
- {
- PWMA_PSCRH = 0x00;
- PWMA_PSCRL = 0x00; // 预分频=1
- PWM_PERIOD = 74; // 周期160 → 24MHz/160 = 150kHz
-
- PWMA_CCER1 = 0x00;
- PWMA_CCER2 = 0x00;
- PWMA_CCMR1X = 0x00; // PWM1模式
- PWMA_CCMR1 = 0x60;
- PWMA_CCMR3X = 0x01; // 组合PWM2模式
- PWMA_CCMR3 = 0x50;
- PWMA_CCMR4X = 0x00; // PWM1模式
- PWMA_CCMR4 = 0x60;
-
- PWMA_CCER1 = 0x55;
- PWMA_CCER2 = 0x55;
-
- PWMA_ARRH = (u8)(PWM_PERIOD >> 8);
- PWMA_ARRL = (u8)PWM_PERIOD;
-
- PWMA_ENO = 0x00;
- PWMA_ENO |= ENO1P;
- PWMA_ENO |= ENO3P;
-
- PWMA_PS = 0x00;
- PWMA_PS |= PWM1_1; // P1.0/P1.1
- PWMA_PS |= PWM3_1; // P1.4/P1.5
-
- PWMB_BKR = 0; // 关
- PWMA_CR1 = 0x01; // 向上计数,开始计时
- }
-
- // PWMA转接函数
- void PWMA_SetDuty(u8 duty1,u8 duty2, u8 deadtime)
- {
- PWMA_CCR1H = (u8)(duty1 >> 8);
- PWMA_CCR1L = (u8)(duty1);
-
- PWMA_CCR3H = (u8)((deadtime) >> 8);
- PWMA_CCR3L = (u8)((deadtime));
- PWMA_CCR4H = (u8)((deadtime + duty2) >> 8);
- PWMA_CCR4L = (u8) (deadtime + duty2);
-
- PWMA_BKR = 0x80; // 使能主输出
- }
-
- void IO_Init(void)
- {
- P1M0 = (P1M0 & ~0xea) | 0x11; P1M1 = (P1M1 & ~0x11) | 0xea; P1IE &= ~0xfb;
- P5M0 &= ~0x10; P5M1 |= 0x10; P5IE &= ~0x10;
- P3M0 = 0x14; P3M1 = 0xeb; P3IE &= ~0xb7;
- }
-
- // 主函数
- void main(void)
- {
- P_SW2 |= 0x80; // SFR enable
-
- IRCDB = 0x10; // 内部高速时钟起振等待稳定的时钟数 低于33Mhz 默认值0x10
- IAP_TPS = 11; // 根据晶振值设置 40Mhz 就是写入40 30Mhz写入30 22.1184Mhz 就是写入22
-
- //EA = 1;
-
- IO_Init();
- PWMA_config();
-
- // 主循环
- while(1)
- {
- PWMA_SetDuty(15,12,2);
- }
- }
复制代码 同样的程序 我烧录在AI8H2K32U-LQFP32上,观测P10 14引脚 是可以观测到波形的
但是烧录在STC8H4K32TL0LQFP32上 观测这两个引脚的时候 观测不到 P14的PWM输出 只有高电平 然后P10是出了PWM的 频率 占空比都对的上
所需波形如图所示 黄色P10 蓝色P14
|
-
|