欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: STC8H8K64 PWM互補輸出3路信號 [打印本頁]

作者: huxingjie9    時間: 2025-11-5 16:45
標題: STC8H8K64 PWM互補輸出3路信號
  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. }
復制代碼







歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1