久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1672|回復: 5
打印 上一主題 下一主題
收起左側(cè)

STC8H單片機輸出互補PWM程序,怎么使其停止輸出

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:140489 發(fā)表于 2024-7-18 17:36 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
STC8H單片機輸出互補PWM,怎么使其停止輸出,像下面這樣寫PWMA_CR1 &= 0xF0; //停止計時,不能停止計時,還是有波形輸出,請大師們幫我想想辦法

if(flag_onoff==1)//開燈
{
P_SW2 |= 0x80; //擴展寄存器(XFR)訪問使能
PWMA_CR1 |= 0x01; //開始計時
UpdatePwm();
}
else //關(guān)燈
{
P_SW2 |= 0x80; //擴展寄存器(XFR)訪問使能
PWMA_CR1 &= 0xF0; //停止計時

// UpdatePwm();
// PWA=0;
// PWB=0;
}

單片機源程序如下:
  1. /*************  功能說明    **************

  2. 本例程基于STC8H1K16為主控芯片編寫測試,STC8H系列芯片可通用參考.

  3. 高級PWM定時器 PWM1P/PWM1N,PWM2P/PWM2N,PWM3P/PWM3N,PWM4P/PWM4N 每個通道都可獨立實現(xiàn)PWM輸出,或者兩兩互補對稱輸出.

  4. 使用PWM1P,PWM1N產(chǎn)生互補的PWM.

  5. 本程序從P1.0(PWM1P)輸出正相脈沖, 從P1.1(PWM1N)輸出反相脈沖(互補).

  6. ******************************************/

  7. #include <STC8H.H>       //包含此頭文件后,不需要再包含"reg51.h"頭文件
  8. #include <intrins.h>


  9. #define     MAIN_Fosc       24000000L   //定義主時鐘

  10. typedef     unsigned char   u8;
  11. typedef     unsigned int    u16;
  12. typedef     unsigned long   u32;

  13. /****************************** 用戶定義宏 ***********************************/

  14. #define PWM1_1      0x00        //P:P1.0  N:P1.1
  15. #define PWM1_2      0x01        //P:P2.0  N:P2.1
  16. #define PWM1_3      0x02        //P:P6.0  N:P6.1

  17. #define PWM2_1      0x00        //P:P1.2/P5.4  N:P1.3
  18. #define PWM2_2      0x04        //P:P2.2  N:P2.3
  19. #define PWM2_3      0x08        //P:P6.2  N:P6.3

  20. #define PWM3_1      0x00        //P:P1.4  N:P1.5
  21. #define PWM3_2      0x10        //P:P2.4  N:P2.5
  22. #define PWM3_3      0x20        //P:P6.4  N:P6.5

  23. #define PWM4_1      0x00        //P:P1.6  N:P1.7
  24. #define PWM4_2      0x40        //P:P2.6  N:P2.7
  25. #define PWM4_3      0x80        //P:P6.6  N:P6.7
  26. #define PWM4_4      0xC0        //P:P3.4  N:P3.3

  27. #define ENO1P       0x01
  28. #define ENO1N       0x02
  29. #define ENO2P       0x04
  30. #define ENO2N       0x08
  31. #define ENO3P       0x10
  32. #define ENO3N       0x20
  33. #define ENO4P       0x40
  34. #define ENO4N       0x80


  35. //#define PWM_PSCR    3     //設(shè)置分頻        頻率2.499KHz @24MHz          1.249KHz @12MHz
  36. //                                                  //頻率計算公式MAIN_Fosc/(PWM_PSCR+1)*(PWM_ARR+1)邊沿對齊
  37. //
  38. //#define PWM_ARR  2400    //設(shè)置周期值


  39. //#define PWM_PSCR    12     //設(shè)置分頻        頻率0.976KHz @12MHz          實測900Hz
  40. //                                                  //頻率計算公式MAIN_Fosc/(PWM_PSCR+1)*(PWM_ARR+1)邊沿對齊
  41. //
  42. //#define PWM_ARR  1023    //設(shè)置周期值

  43. #define PWM_PSCR    46     //設(shè)置分頻        頻率1KHz @12MHz          實測1.001KHz@12MHz
  44.                                                   //頻率計算公式MAIN_Fosc/(PWM_PSCR+1)*(PWM_ARR+1)邊沿對齊

  45. #define PWM_ARR  254    //設(shè)置周期值

  46. sbit k3=P3^7;
  47. sbit PWA=P1^0;
  48. sbit PWB=P1^1;
  49. u8 key_cont,key_lock;
  50. /*************  本地變量聲明    **************/

  51. u16 PWM1_Duty;         //占空比
  52. u8        PWM_Index;        //SPWM查表索引
  53. bit flag_onoff=0;
  54. void UpdatePwm();
  55. ///////////////////////

  56. void Timer0_Init(void)                //2毫秒@12.000MHz
  57. {
  58.         AUXR |= 0x80;                        //定時器時鐘1T模式
  59.         TMOD &= 0xF0;                        //設(shè)置定時器模式   T0 16位自動重載
  60.         TL0 = 0x40;                                //設(shè)置定時初始值
  61.         TH0 = 0xA2;                                //設(shè)置定時初始值
  62.         TF0 = 0;                                //清除TF0標志
  63.         TR0 = 1;                                //定時器0開始計時
  64.         ET0=1;
  65.         EA=1;
  66. }

  67. void keyscan()
  68. {
  69.         if(k3)
  70.         {
  71.                 key_lock=0;
  72.                 key_cont=0;               
  73.         }
  74.         else if(key_lock==0)
  75.         {
  76.                 ++key_cont;
  77.                 if(key_cont==10)
  78.                 {
  79.                         key_cont=0;
  80.                         key_lock=1;
  81.                         flag_onoff=!flag_onoff;
  82.                 }        
  83.         }
  84. }

  85. /******************** 主函數(shù) **************************/
  86. void main(void)
  87. {
  88.         Timer0_Init();

  89.     P_SW2 |= 0x80;  //擴展寄存器(XFR)訪問使能

  90.     P0M1 = 0x00;   P0M0 = 0x00;   //
  91.     P1M1 = 0x00;   P1M0 = 0x00;   //
  92.     P2M1 = 0x00;   P2M0 = 0x00;   //
  93.     P3M1 = 0x00;   P3M0 = 0x00;   //
  94.     P4M1 = 0x00;   P4M0 = 0x00;   //
  95.     P5M1 = 0x00;   P5M0 = 0x00;   //
  96.     P6M1 = 0x00;   P6M0 = 0x00;   //
  97.     P7M1 = 0x00;   P7M0 = 0x00;   //

  98.         PWA=0;
  99.         PWB=0;
  100. //    PWM1_Duty = 1220;
  101.     PWM1_Duty = 100;

  102.     PWMA_CCER1 = 0x00; //寫 CCMRx 前必須先清零 CCxE 關(guān)閉通道
  103.     PWMA_CCER2 = 0x00;
  104.     PWMA_CCMR1 = 0x60; //通道模式配置  PWM模式1
  105. //    PWMA_CCMR2 = 0x60;
  106. //    PWMA_CCMR3 = 0x60;
  107. //    PWMA_CCMR4 = 0x60;
  108.     PWMA_CCER1 = 0x05; //配置通道輸出使能和極性         OC1通道負極開啟比較輸出,(OC1通道正極)CC1通道配置為輸出低電平有效
  109. //    PWMA_CCER2 = 0x55;

  110.     PWMA_CCMR1 |= 0x08; //開啟PWMA_CCR1預裝載功能(需要CC1E=1才可寫)
  111. //    PWMA_CCMR2 |= 0x08;
  112. //    PWMA_CCMR3 |= 0x08;
  113. //    PWMA_CCMR4 |= 0x08;

  114. //    PWMA_ARRH = 0x09; //設(shè)置周期時間  2400
  115. //    PWMA_ARRL = 0x60;

  116.     PWMA_ARRH = (u8)(PWM_ARR >> 8);  //設(shè)置周期時間
  117.     PWMA_ARRL = (u8)PWM_ARR;

  118.     PWMA_CCR1H = (u8)(PWM1_Duty >> 8); //設(shè)置占空比時間
  119.     PWMA_CCR1L = (u8)(PWM1_Duty);

  120.         PWMA_PSCRH = (u8)(PWM_PSCR>>8);     //設(shè)置分頻
  121.     PWMA_PSCRL = (u8)(PWM_PSCR);

  122. //    PWMA_DTR = 0x0C;   //設(shè)置死區(qū)時間        0000 1100    0.5us  @24MHz          (1/MAIN_Fosc)*1000000*12=0.5
  123. //    PWMA_DTR = 0x1F;   //設(shè)置死區(qū)時間        1.29us        @24MHz
  124.     PWMA_DTR = 0x81;   //設(shè)置死區(qū)時間        5.4us        @24MHz    10.8us        @12MHz

  125. //    PWMA_DTR = 0xFF;   //設(shè)置死區(qū)時間        42us        @24MHz

  126.     PWMA_ENO = 0x00;
  127.     PWMA_ENO |= ENO1P; //使能輸出
  128.     PWMA_ENO |= ENO1N; //使能輸出

  129. //    PWMA_ENO |= ENO2P; //使能輸出
  130. //    PWMA_ENO |= ENO2N; //使能輸出
  131. //    PWMA_ENO |= ENO3P; //使能輸出
  132. //    PWMA_ENO |= ENO3N; //使能輸出
  133. //    PWMA_ENO |= ENO4P; //使能輸出
  134. //    PWMA_ENO |= ENO4N; //使能輸出

  135.     PWMA_PS = 0x00;  //高級 PWM 通道輸出腳選擇位
  136.     PWMA_PS |= PWM1_1; //選擇 PWM1_1 通道
  137. //    PWMA_PS |= PWM2_3; //選擇 PWM2_3 通道
  138. //    PWMA_PS |= PWM3_3; //選擇 PWM3_3 通道
  139. //    PWMA_PS |= PWM4_3; //選擇 PWM4_3 通道

  140.     PWMA_BKR = 0x80; //使能主輸出
  141.     PWMA_IER = 0x01; //使能中斷
  142.     PWMA_CR1 |= 0x01; //開始計時

  143. //    EA = 1;     //打開總中斷         不用PWMA中斷函數(shù),可以不打開總中斷

  144.     while (1)
  145.     {
  146.                 if(flag_onoff==1)//開燈
  147.                 {
  148.                 //        P_SW2 |= 0x80;  //擴展寄存器(XFR)訪問使能
  149.                         
  150.             //        PWMA_CR1 |= 0x01; //開始計時
  151.                         UpdatePwm();
  152.                 }
  153.                 else  //關(guān)燈
  154.                 {
  155.                 //        P_SW2 |= 0x80;  //擴展寄存器(XFR)訪問使能
  156.         
  157.             //        PWMA_CR1 &= 0xF0; //停止計時
  158.                         
  159.                 //        UpdatePwm();
  160. //                        PWA=0;
  161. //                        PWB=0;               
  162.                 }
  163.     }
  164. }
  165. //========================================================================
  166. // 函數(shù): UpdatePwm(void)
  167. // 描述: 更新PWM占空比.
  168. // 參數(shù): none.
  169. // 返回: none.
  170. // 版本: V1.0, 2012-11-22
  171. //========================================================================
  172. void UpdatePwm(void)
  173. {
  174.         P_SW2 |= 0x80;
  175.         PWMA_CCR1H = (u8)(PWM1_Duty >> 8); //設(shè)置占空比時間
  176.     PWMA_CCR1L = (u8)(PWM1_Duty);
  177. //          PWMA_CCR2H = (u8)(PWM2_Duty >> 8); //設(shè)置占空比時間
  178. //    PWMA_CCR2L = (u8)(PWM2_Duty);
  179. //          PWMA_CCR3H = (u8)(PWM3_Duty >> 8); //設(shè)置占空比時間
  180. //    PWMA_CCR3L = (u8)(PWM3_Duty);
  181. //          PWMA_CCR4H = (u8)(PWM4_Duty >> 8); //設(shè)置占空比時間
  182. //    PWMA_CCR4L = (u8)(PWM4_Duty);
  183.         P_SW2 &= 0x7f;
  184. }
  185. /******************** 中斷函數(shù) **************************/
  186. //PWMA中斷處理程序
  187. //void PWMA_ISR() interrupt 26
  188. //{
  189. //    if(PWMA_SR1 & 0X01)
  190. //    {
  191. //        PWMA_SR1 &=~0X01;
  192. ////        PWM1_Duty = T_SinTable[PWM_Index];
  193. ////        if(++PWM_Index >= 200)        PWM_Index = 0;
  194. //
  195. //        PWMA_CCR1H = (u8)(PWM1_Duty >> 8); //設(shè)置占空比時間
  196. //        PWMA_CCR1L = (u8)(PWM1_Duty);
  197. //    }
  198. //    PWMA_SR1 = 0;
  199. //}

  200. /////////////////////
  201. void timer0_ISR() interrupt 1
  202. {
  203.         keyscan();
  204. }
復制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:1128908 發(fā)表于 2024-7-19 20:44 | 只看該作者
  1.         // 假設(shè)你有一個函數(shù)用于初始化PWM,例如:
  2. void PWM_Init(void)
  3. {
  4.     // 初始化PWM的代碼...
  5.     // 設(shè)置周期、占空比等
  6. }

  7. // 停止PWM輸出的函數(shù)
  8. void PWM_Stop(void)
  9. {
  10.     // 找到控制PWM的寄存器,并寫入適當?shù)闹狄酝V筆WM
  11.     // 例如,如果有一個名為PWM_CTL的寄存器,并且寫入0可以停止PWM
  12.     PWM_CTL = 0; // 假設(shè)這是停止PWM的正確操作
  13.    
  14.     // 如果需要,禁用GPIO引腳作為PWM輸出
  15.     // 例如,如果GPIO_PIN是PWM輸出的引腳
  16.     GPIO_PIN_MODE(GPIO_PIN, GPIO_MODE_OUT_PP); // 設(shè)置為普通推挽輸出或禁用輸出
  17.     // 或者,如果你有一個函數(shù)來禁用GPIO引腳,可以調(diào)用它
  18.     // GPIO_DisableOutput(GPIO_PIN);
  19. }

  20. // 在主函數(shù)或其他地方調(diào)用這些函數(shù)
  21. int main(void)
  22. {
  23.     // 初始化PWM
  24.     PWM_Init();
  25.    
  26.     // ... 其他代碼 ...
  27.    
  28.     // 當需要停止PWM時
  29.     PWM_Stop();
  30.    
  31.     // ... 其他代碼 ...
  32.    
  33.     return 0;
  34. }
復制代碼

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:1034262 發(fā)表于 2024-7-19 22:12 | 只看該作者
簡單!
STC8H系列的高級PWM,連續(xù)輸出0或1有2種方法(以PWM1P為例):

1、使用PWMx_ENO禁止輸出PWM,對應IO成為普通IO,禁止PWM輸出后,由這個IO直接輸出高或低電平。
  PWMA_ENO |= 0x01;   // 允許PWM1P輸出
  delay_ms(5);        // P1.0輸出PWM 5ms
  P10 = 1;            // P1.0輸出高電平
  PWMA_ENO &= ~0x01;  // 關(guān)閉PWM輸出
  delay_ms(5);        // P1.0輸出高電平5ms
               
  PWMA_ENO |= 0x01;   // 允許PWM1P輸出
  delay_ms(5);        // P1.0輸出PWM 5ms
  P10 = 0;            // P1.0輸出低電平
  PWMA_ENO &= ~0x01;  // 關(guān)閉PWM輸出
  delay_ms(5);        // P1.0輸出高電平5ms

2、設(shè)置PWMx_CCMRn,強制PWM輸出有效(高)電平/無效(低)電平。
  PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x60;  // PWM正常輸出
  delay_ms(5);                               // PWM輸出5ms
  PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x40;  // 強制PWM輸出無效(低)電平
  delay_ms(5);                               // PWM輸出低電平5ms
  PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x60;  // PWM正常輸出
  delay_ms(5);                               // PWM輸出5ms
  PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x50;  //強制PWM輸出有效(高)電平
  delay_ms(5);                               // PWM輸出高電平5ms
回復

使用道具 舉報

地板
ID:1110945 發(fā)表于 2024-7-20 09:53 | 只看該作者
可以設(shè)置某一通道占空比時間=0,//只關(guān)某一通道
也可以設(shè)置PWMA_ENO   // 關(guān)閉某一通道PWM輸出
還有剎車信號可以使其全部關(guān)閉
回復

使用道具 舉報

5#
ID:748084 發(fā)表于 2024-8-9 10:33 | 只看該作者
PWMA_ENO    = 0;
回復

使用道具 舉報

6#
ID:748084 發(fā)表于 2024-8-9 10:34 | 只看該作者
我的關(guān)斷PWM程序并輸出低電平如下,希望對你有幫助。

void disable_pwm()
{
        PWM_Flag = 0;
        PWMA_CR1 = 0; // 清零,停止PCA計數(shù)器工作
    PT0 = 0; // 清除定時器0溢出標志
    PT1 = 0; // 清除定時器1溢出標志
//        PWMA_ENO &= ~0x01; // 關(guān)閉PWM輸出
        PWMA_ENO = 0x00;
        PWMA_BKR = 0x00;   //PWMA的OC OCA禁止輸出
        P2M0 = 0x00 ;           // 0xFF ;       
    P2M1 = 0x00;            //0xFF 設(shè)ALL為漏極開路;
        P2INTE = 0x00;     //
        P2 = 0;

        delay_ms(1);
}
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产高清在线观看 | 亚洲精品一区二区在线观看 | 久久69精品久久久久久久电影好 | 亚洲免费在线播放 | 美女黄视频网站 | 国产九九精品视频 | 久草.com | 成人久久久久 | 国产探花在线精品一区二区 | 日韩在线中文字幕 | 国产精品一区二区三区在线 | 夜夜操操操| 成人三级视频在线观看 | 色噜噜亚洲男人的天堂 | 黄色在线免费观看 | 欧美综合一区二区 | 国产一级毛片视频 | 91中文在线观看 | 精品欧美一区二区三区久久久 | 欧美日韩亚洲国产综合 | 日韩欧美综合在线视频 | 日韩精品一区二区三区久久 | 国家一级黄色片 | 超碰在线97国产 | 成年免费视频 | 天天操天天射综合网 | 91免费在线| 国产精品成人久久久久 | 夜夜骑天天干 | 国产精品久久久久一区二区三区 | 日韩国产一区 | 亚洲少妇综合网 | 国产精品福利一区二区三区 | 99视频| www.国产精品| 日本午夜免费福利视频 | 国产精品福利久久久 | 嫩草视频在线免费观看 | 无码国模国产在线观看 | 国产伦精品一区二区三区在线 | 亚洲精品一区二三区不卡 |