找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 473|回复: 0
打印 上一主题 下一主题
收起左侧

STC8H8K64 PWM互补输出3路信号

[复制链接]
跳转到指定楼层
楼主
ID:880573 发表于 2025-11-5 16:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include "STC8H.h"

  2. // 定义 PWM 引脚(主通道和互补通道)
  3. sbit PWM1_OUT = P3^0;   // 主 PWM1
  4. sbit PWM1B_OUT = P3^1;  // 互补 PWM1
  5. sbit PWM2_OUT = P3^2;   // 主 PWM2
  6. sbit PWM2B_OUT = P3^3;  // 互补 PWM2
  7. sbit PWM3_OUT = P3^4;   // 主 PWM3
  8. sbit PWM3B_OUT = P3^5;  // 互补 PWM3

  9. // PWM 占空比(0~255,8位PWM)
  10. unsigned char PWM1_Duty = 128;  // 50% 占空比
  11. unsigned char PWM2_Duty = 128;
  12. unsigned char PWM3_Duty = 128;

  13. // 死区时间(单位:us,需根据实际需求调整)
  14. #define DEAD_TIME 2   // 2us 死区

  15. // 延时函数(微秒级,根据系统时钟调整)
  16. void DelayUs(unsigned int us) {
  17.     while(us--);
  18. }

  19. // 初始化 PCA 模块为 8 位 PWM 模式
  20. void PCA_Init() {
  21.     PCA_PWM0 = 0x00;  // 通道0:8位PWM,无相位反转
  22.     PCA_PWM1 = 0x00;  // 通道1:8位PWM,无相位反转
  23.     PCA_PWM2 = 0x00;  // 通道2:8位PWM,无相位反转
  24.    
  25.     // 设置 PCA 时钟源:系统时钟/12(假设系统时钟11.0592MHz,PWM频率≈11.0592MHz/(12*256)≈3.58kHz)
  26.     PCA_CLK = 0x02;   // 时钟源选择:SYSclk/12
  27.    
  28.     // 设置初始占空比
  29.     PCA0 = 255 - PWM1_Duty;  // 8位PWM:占空比 = (255 - PCAx)/256
  30.     PCA1 = 255 - PWM2_Duty;
  31.     PCA2 = 255 - PWM3_Duty;
  32.    
  33.     // 使能 PCA 中断和模块
  34.     EA = 1;         // 总中断使能
  35.     EPCA = 1;       // PCA 中断使能
  36.     PCA_RUN = 1;    // 启动 PCA 计数器
  37. }

  38. // PCA 中断服务函数(处理互补输出和死区)
  39. void PCA_ISR() interrupt 7 {
  40.     // 清除中断标志
  41.     if (CCF0) CCF0 = 0;  // 通道0中断标志
  42.     if (CCF1) CCF1 = 0;  // 通道1中断标志
  43.     if (CCF2) CCF2 = 0;  // 通道2中断标志
  44.    
  45.     // 读取当前主 PWM 状态(高/低电平)
  46.     bit pwm1_state = PWM1_OUT;
  47.     bit pwm2_state = PWM2_OUT;
  48.     bit pwm3_state = PWM3_OUT;
  49.    
  50.     // 生成互补 PWM(带死区)
  51.     // 1. 主 PWM 为高电平时,互补 PWM 先关断,延时死区后再开低电平
  52.     // 2. 主 PWM 为低电平时,互补 PWM 先关断,延时死区后再开高电平
  53.    
  54.     // 处理 PWM1 互补
  55.     PWM1B_OUT = 0;          // 先关断互补通道
  56.     DelayUs(DEAD_TIME);     // 死区延时
  57.     PWM1B_OUT = !pwm1_state;// 互补输出
  58.    
  59.     // 处理 PWM2 互补
  60.     PWM2B_OUT = 0;
  61.     DelayUs(DEAD_TIME);
  62.     PWM2B_OUT = !pwm2_state;
  63.    
  64.     // 处理 PWM3 互补
  65.     PWM3B_OUT = 0;
  66.     DelayUs(DEAD_TIME);
  67.     PWM3B_OUT = !pwm3_state;
  68. }

  69. void main() {
  70.     PCA_Init();
  71.     while(1) {
  72.         // 可在此动态调整占空比(示例:固定占空比)
  73.         // PWM1_Duty = ...;
  74.         // PCA0 = 255 - PWM1_Duty;
  75.     }
  76. }
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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