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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2849|回復: 22
打印 上一主題 下一主題
收起左側

STC8單片機做逆變50hz,這里的例子程序,要怎么改?

  [復制鏈接]
跳轉到指定樓層
樓主
一個SPWM帶有死區的程序 用STC8A8K64S4A12單片機編寫的SPWM
  1. //一個SPWM帶有死區的程序 用STC8A8K64S4A12單片機編寫的SPWM
  2. //介紹了一種高性能微機控制的單相 SPWM 變頻調速系統
  3. // SPWM信號經低通濾波后可變換為正弦波,窄帶范圍內的方波經低通濾波后可變換為相應頻率的正弦波
  4. //程序能用,如果不是你想要的頻率,那就 自己改一下數據 記得同時要替換數組里面的值
  5. #define         MAIN_Fosc                24000000L        //定義主時鐘
  6. #include        "STC8.H"
  7. unsigned int code T_SinTable[]={
  8. 1220, 1256, 1292, 1328, 1364, 1400, 1435, 1471, 1506, 1541,
  9. 1575, 1610, 1643, 1677, 1710, 1742, 1774, 1805, 1836, 1866,
  10. 1896, 1925, 1953, 1981, 2007, 2033, 2058, 2083, 2106, 2129,
  11. 2150, 2171, 2191, 2210, 2228, 2245, 2261, 2275, 2289, 2302,
  12. 2314, 2324, 2334, 2342, 2350, 2356, 2361, 2365, 2368, 2369,
  13. 2370, 2369, 2368, 2365, 2361, 2356, 2350, 2342, 2334, 2324,
  14. 2314, 2302, 2289, 2275, 2261, 2245, 2228, 2210, 2191, 2171,
  15. 2150, 2129, 2106, 2083, 2058, 2033, 2007, 1981, 1953, 1925,
  16. 1896, 1866, 1836, 1805, 1774, 1742, 1710, 1677, 1643, 1610,
  17. 1575, 1541, 1506, 1471, 1435, 1400, 1364, 1328, 1292, 1256,
  18. 1220, 1184, 1148, 1112, 1076, 1040, 1005, 969, 934, 899,
  19. 865, 830, 797, 763, 730, 698, 666, 635, 604, 574,
  20. 544, 515, 487, 459, 433, 407, 382, 357, 334, 311,
  21. 290, 269, 249, 230, 212, 195, 179, 165, 151, 138,
  22. 126, 116, 106, 98, 90, 84, 79, 75, 72, 71,
  23. 70, 71, 72, 75, 79, 84, 90, 98, 106, 116,
  24. 126, 138, 151, 165, 179, 195, 212, 230, 249, 269,
  25. 290, 311, 334, 357, 382, 407, 433, 459, 487, 515,
  26. 544, 574, 604, 635, 666, 698, 730, 763, 797, 830,
  27. 865, 899, 934, 969, 1005, 1040, 1076, 1112, 1148, 1184,
  28. };
  29. #define        PwmClk_1T        0
  30. #define        PwmClk_2T        1
  31. #define        PwmClk_3T        2
  32. #define        PwmClk_4T        3
  33. #define        PwmClk_5T        4
  34. #define        PwmClk_6T        5
  35. #define        PwmClk_7T        6
  36. #define        PwmClk_8T        7
  37. #define        PwmClk_9T        8
  38. #define        PwmClk_10T        9
  39. #define        PwmClk_11T        10
  40. #define        PwmClk_12T        11
  41. #define        PwmClk_13T        12
  42. #define        PwmClk_14T        13
  43. #define        PwmClk_15T        14
  44. #define        PwmClk_16T        15
  45. #define        PwmClk_T2        16
  46. #define        EAXSFR()                P_SW2 |=  0x80        /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作對象為擴展SFR(XSFR) */
  47. #define        EAXRAM()                P_SW2 &= ~0x80        /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作對象為擴展RAM(XRAM) */
  48. #define        PWM_Enable()        PWMCR |=  0x80        /* 使能PWM波形發生器,PWM計數器開始計數 */
  49. #define        PWM_Disable()        PWMCR &= ~0x80        /* 關閉PWM波形發生器 */
  50. #define P2n_standard(bitn)                        P2M1 &= ~(bitn),        P2M0 &= ~(bitn)
  51. #define P2n_push_pull(bitn)                        P2M1 &= ~(bitn),        P2M0 |=  (bitn)
  52. #define P2n_pure_input(bitn)                P2M1 |=  (bitn),        P2M0 &= ~(bitn)
  53. #define P2n_open_drain(bitn)                P2M1 |=  (bitn),        P2M0 |=  (bitn)
  54. #define                PWM_VECTOR                22
  55. #define                PWM_DeadZone        12        /* 死區時鐘數, 6 ~ 24之間  */
  56. typedef unsigned char         u8;
  57. typedef unsigned int          u16;
  58. typedef unsigned long         u32;
  59. sbit OE245 =P4^1;
  60. sbit LED_OUT =P3^3;
  61. #define Port P1                         //設置CPU和模塊的通訊接口
  62. u8        PWM_Index;        //SPWM查表索引
  63. void delay(unsigned long d)
  64. {
  65.   while(d--);
  66. }
  67. //========================================================================
  68. // 函數: void        PWM_config(void)
  69. // 描述: PWM配置函數。
  70. // 參數: none.
  71. // 返回: none.
  72. // 版本: VER1.0
  73. // 日期:
  74. // 備注:
  75. //========================================================================
  76. void        PWM_config(void)
  77. {
  78.   EAXSFR();                        // 訪問XFR
  79.   PWM3T1 = 65; // 第一個翻轉計數
  80.   PWM3T2=1220;         // 第二個翻轉計數
  81.   PWM3CR =0;         // PWM3輸出選擇P2.3, 無中斷
  82.   PWM3CR  |=  0x80;        // 相應PWM通道的端口為PWM輸出口,受PWM波形發生器控制 ENC30
  83.   PWM3CR &= ~0x40;        // 設置PWM輸出端口的初始電平為0 C3INI
  84.   P23 = 0;
  85.   P2n_push_pull(1<<3);        //IO初始化, 上電時為高阻
  86.   PWM4T1= 65-PWM_DeadZone;                        // 第一個翻轉計數低字節
  87.   PWM4T2 = (1220+PWM_DeadZone); // 第二個翻轉計數高字節
  88.   PWM4CR = 0;        // PWM4輸出選擇P2.2, 無中斷
  89.   PWM4CR  |=  0x80;        // 相應PWM通道的端口為PWM輸出口,受PWM波形發生器控制 ENC40
  90.   //        PWMCFG &= ~0x04;        // 設置PWM輸出端口的初始電平為0  C4INI
  91.   PWM4CR |=  0x40;        // 設置PWM輸出端口的初始電平為1
  92.   P24 = 1;
  93.   P2n_push_pull(1<<4);        //IO初始化, 上電時為高阻
  94.   PWMC = 2400;        // PWM計數器的高字節
  95.   PWMCKS = PwmClk_1T;        // 時鐘源: PwmClk_1T,PwmClk_2T, ... PwmClk_16T, PwmClk_Timer2
  96.   EAXRAM();                        // 恢復訪問XRAM
  97.   PWMCR |= ENPWM;                // 使能PWM波形發生器,PWM計數器開始計數
  98.   //        PWMCR &= ~ECBI;                // 禁止PWM計數器歸零中斷
  99.   PWMCR |=  ECBI;                // 允許PWM計數器歸零中斷
  100.   //        PWMFDCR = ENFD | FLTFLIO | FDIO;        //PWM失效中斷控制,  ENFD | FLTFLIO | EFDI | FDCMP | FDIO
  101. }
  102. /**********************************************/
  103. void main(void)
  104. {
  105.   unsigned char i;
  106.   OE245 =0;
  107.   LED_OUT =1;
  108.   PWM_config();        //初始化PWM
  109.   EA = 1;                //允許全局中斷
  110.   while (1)
  111.   {
  112.     for(i=1;i!=0;i<<=1)  // 0000 0000
  113.     {
  114.       Port =~i; //0111 1111
  115.       delay(200000);
  116.     }
  117.   }
  118. }
  119. /********************* PWM中斷函數************************/
  120. void PWM_int (void) interrupt PWM_VECTOR
  121. {
  122.   u16        j;
  123.   u8        SW2_tmp;
  124.   if(PWMCFG & CBIF)        //PWM計數器歸零中斷標志 PWMCFG
  125.   {
  126.     PWMCFG &= ~CBIF;        //清除中斷標志
  127.     SW2_tmp = P_SW2;        //保存SW2設置
  128.     EAXSFR();                //訪問XFR
  129.     j = T_SinTable[PWM_Index];
  130.     PWM3T2H = (u8)(j >> 8);        //第二個翻轉計數高字節
  131.     PWM3T2L  = (u8)j;                        //第二個翻轉計數低字節
  132.     j += PWM_DeadZone;                //死區
  133.     // 指向PWM4
  134.     PWM4T2H = (u8)(j >> 8);        //第二個翻轉計數高字節
  135.     PWM4T2L = (u8)j;                        //第二個翻轉計數低字節
  136.     P_SW2 = SW2_tmp;        //恢復SW2設置
  137.     if(++PWM_Index >= 200)        PWM_Index = 0;
  138.   }
  139. }
復制代碼


單片機SPWM波 產生正弦波的源程序及工具
http://www.zg4o1577.cn/bbs/dpj-55510-1.html
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:675799 發表于 2021-11-24 16:05 | 只看該作者
這個 并沒有直接指定 頻率, 那要 50HZ, 或則45HZ, 要怎么修改。
回復

使用道具 舉報

板凳
ID:675799 發表于 2021-11-25 14:03 | 只看該作者
估計這個 掛這個1年,總有回復1下答案吧。
回復

使用道具 舉報

地板
ID:624769 發表于 2021-11-25 14:49 | 只看該作者
回復 +1
要回復容易,這就給你回復了。
問題是,別人如何我不知道,我是因為你的題目看不懂,所以,幫不了你…… 只好一直不回復……
回復

使用道具 舉報

5#
ID:123289 發表于 2021-11-25 16:06 | 只看該作者
1、你想達成什么目的?假設是A。
2、你給出的例子,達成了什么目的?假設是B。
3、A與B有什么關聯,你想利用B的哪些東東,來達成A。
4、從B到A,哪幾項不會,需要幫助?
擰得清?


回復

使用道具 舉報

6#
ID:675799 發表于 2021-11-25 16:34 | 只看該作者
繼續問,直到有人會, 估計也沒幾個會。  會皮毛的,估計也不多。
回復

使用道具 舉報

7#
ID:96682 發表于 2021-11-27 05:34 來自手機 | 只看該作者
弱弱的問一句,上面的 《……T_SinTable[]={……》怎么來的?
回復

使用道具 舉報

8#
ID:675799 發表于 2021-11-29 10:04 | 只看該作者
wc86110 發表于 2021-11-27 05:34
弱弱的問一句,上面的 《……T_SinTable[]={……》怎么來的?

定義1個 正弦波sin數組, 數值,是他們用軟件生成,終值1220
回復

使用道具 舉報

9#
ID:844772 發表于 2021-11-29 17:39 | 只看該作者
1.這里是用積分表示SIN函數,你可以理解把一個周期切成200片,通過占空比不同,用矩形波代替每片的函數,然后再通過低通就是正弦波了。
2.用200個PWM(不同占空比的波)表示一個正弦波。
3.所以就很明顯了,你sin函數的頻率就是PWM頻率除以200,要調整頻率就幾種了,一種是調整PWM,一種是改變函數取樣數量(目前是200),還有就是用幾個PWM處理一片(這樣會更平滑)。
不知道我說明白沒,好多人不懂其實是數學問題。

評分

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

查看全部評分

回復

使用道具 舉報

10#
ID:675799 發表于 2021-11-30 08:46 | 只看該作者
24000000L /200點 /2400計數器=50HZ,

如果 要輸出 45,   240000000/200 /2666=45hz   
PWMC = 2666;        // PWM計數器的高字節 ,  2666為45HZ
  PWMCKS = PwmClk_1T;        // 時鐘源: PwmClk_1T,PwmClk_2T, ... PwmClk_16T, PwmClk_Timer2
回復

使用道具 舉報

11#
ID:844772 發表于 2021-11-30 09:08 | 只看該作者
hww22 發表于 2021-11-30 08:46
24000000L /200點 /2400計數器=50HZ,

如果 要輸出 45,   240000000/200 /2666=45hz   

對啊,我說的就是這個意思。
回復

使用道具 舉報

12#
ID:675799 發表于 2021-11-30 15:04 | 只看該作者
glinfei 發表于 2021-11-30 09:08
對啊,我說的就是這個意思。

如果要檢測,輸出的4個管子,過流,然后,降低脈寬(功率),要怎么寫代碼? P1.2端口,低電平表示過流。 因為浴霸啟動電流大,所以要低功率,啟動1下。
回復

使用道具 舉報

13#
ID:844772 發表于 2021-12-1 08:56 | 只看該作者
hww22 發表于 2021-11-30 15:04
如果要檢測,輸出的4個管子,過流,然后,降低脈寬(功率),要怎么寫代碼? P1.2端口,低電平表示過流。  ...

不過是調整PWM2_2的T1T2,減小占空比而已,要注意是動態調,不過流就增大占空比,使得一直處于快要過流狀態。
回復

使用道具 舉報

14#
ID:675799 發表于 2021-12-3 11:36 | 只看該作者
glinfei 發表于 2021-12-1 08:56
不過是調整PWM2_2的T1T2,減小占空比而已,要注意是動態調,不過流就增大占空比,使得一直處于快要過流狀 ...

oid main(void)
{
  unsigned char i;
  OE245 =0;
  LED_OUT =1;
  PWM_config();        //初始化PWM
  EA = 1;                //允許全局中斷
  while (1)
  {
    for(i=1;i!=0;i<<=1)  // 0000 0000
    {///////////
if (過流)
          { PWM3T1 = 65; // 第一個翻轉計數 改 35  ??
  PWM3T2=1220;         // 第二個翻轉計數 改 610  ???
PWM4T1= 65-PWM_DeadZone;                        // 第一個翻轉計數低字節  降級脈沖 65改35??
  PWM4T2 = (1220+PWM_DeadZone); // 第二個翻轉計數高字節 1220改610 ??

}
if(不過流)
   { PWM3T1 = 65; // 第一個翻轉計數 改 35  ??
  PWM3T2=1220;         // 第二個翻轉計數 改 610  ???
PWM4T1= 65-PWM_DeadZone;                        // 第一個翻轉計數低字節  降級脈沖 65改35??
  PWM4T2 = (1220+PWM_DeadZone); // 第二個翻轉計數高字節 1220改610 ??

}//////////////
      Port =~i; //0111 1111
      delay(200000);
    }
  }
}
回復

使用道具 舉報

15#
ID:675799 發表于 2021-12-6 10:46 | 只看該作者
while (1)
  {
    for(i=1;i!=0;i<<=1)  // 0000 0000
    {///////////
if (過流)
          { PWM3T1 = 65; // 第一個翻轉計數 改 35  ??
  PWM3T2=1220;         // 第二個翻轉計數 改 610  ???
PWM4T1= 65-PWM_DeadZone;                        // 第一個翻轉計數低字節  降級脈沖 65改35??
  PWM4T2 = (1220+PWM_DeadZone); // 第二個翻轉計數高字節 1220改610 ??

}
if(輕負荷)
{ PWM3T1 = 65; // 第一個翻轉計數 改 30  ??
  PWM3T2=1220;         // 第二個翻轉計數 改 405  ???
PWM4T1= 65-PWM_DeadZone;                        // 第一個翻轉計數低字節  降級脈沖 65改30??
  PWM4T2 = (1220+PWM_DeadZone); // 第二個翻轉計數高字節 1220改610 ??

}//////////////
if(不過流)
   { PWM3T1 = 65; // 第一個翻轉計數 改 35  ??
  PWM3T2=1220;         // 第二個翻轉計數 改 610  ???
PWM4T1= 65-PWM_DeadZone;                        // 第一個翻轉計數低字節  降級脈沖 65改35??
  PWM4T2 = (1220+PWM_DeadZone); // 第二個翻轉計數高字節 1220改610 ??

}//////////////
回復

使用道具 舉報

16#
ID:507641 發表于 2021-12-7 19:27 | 只看該作者
寫程序要與硬件配合的,都沒有實質的科目怎么討論?
回復

使用道具 舉報

17#
ID:675799 發表于 2021-12-27 15:27 | 只看該作者
SURUBU1976 發表于 2021-12-7 19:27
寫程序要與硬件配合的,都沒有實質的科目怎么討論?

實際上,電路 很多是1邊輸入 正弦波脈沖, 1邊輸入 同極性的 電平信號。
回復

使用道具 舉報

18#
ID:675799 發表于 2021-12-27 15:37 | 只看該作者
glinfei 發表于 2021-11-30 09:08
對啊,我說的就是這個意思。

為了降低 脈沖突變, 所以現在是 2個上管,輪流送 正弦波脈沖, 2個下管輪流送同級性的電平信號。
都是在 讀取的 0值, (最小值0)。 進行 下管切換換的。

程序要怎么寫才合理。
回復

使用道具 舉報

19#
ID:675799 發表于 2021-12-27 15:50 | 只看該作者
由于要在0值 切換 下管 的極性,所以代碼 不好理解, 上面的 正弦波值, 都沒有0

22222.jpg (17.39 KB, 下載次數: 104)

22222.jpg
回復

使用道具 舉報

20#
ID:844772 發表于 2021-12-27 17:49 | 只看該作者
本帖最后由 glinfei 于 2021-12-27 18:09 編輯

你過流時,應該不動T1,只改T2就行啊,根據過流情況給 T_SinTable[PWM_Index]乘以一個百分比整體降壓;你是在做H橋逆變吧?帶了死區,沒啥特別建議,分別看看波形再上負載;
你是在直流上做正弦波,零在T_SinTable[]=1220,實在不行你就利用PWM控制你說的上下管導通(帶了死區);利用PWM_Index控制左右管導通?
另外,調整T_SinTable[],很容易做出你圖一的波形。
回復

使用道具 舉報

21#
ID:675799 發表于 2021-12-28 08:34 | 只看該作者
本帖最后由 hww22 于 2021-12-28 08:57 編輯
glinfei 發表于 2021-12-27 17:49
你過流時,應該不動T1,只改T2就行啊,根據過流情況給 T_SinTable乘以一個百分比整體降壓;你是在做H橋逆變 ...

直流310V , H 橋 的。       自己做來玩玩, 驅動 卷簾門,之類。 停電神器。
T_SinTable 乘以一個百分比整體降壓, 放在中斷函數 里面,是吧。
這么說 我把2個 下管 輪流送 方波信號, 就可以了。  
if (j==1220)   //0值, 就切換方波 比如 P1.6    P1.7
{P1.6 =0;
P1.7 =1; }
if (j==???)   //0值, 就切換方波 比如 P1.6    P1.7
{P1.6 =1;
P1.7 =0; }


問題是  1個周期有 4個 0值吧。  其余3個 呢?
回復

使用道具 舉報

22#
ID:675799 發表于 2021-12-28 08:57 | 只看該作者
本帖最后由 hww22 于 2021-12-28 09:27 編輯

********************* PWM中斷函數************************/
void PWM_int (void) interrupt PWM_VECTOR
{
  u16        j;
  u8        SW2_tmp;
  if(PWMCFG & CBIF)        //PWM計數器歸零中斷標志 PWMCFG
  {
    PWMCFG &= ~CBIF;        //清除中斷標志
    SW2_tmp = P_SW2;        //保存SW2設置
    EAXSFR();                //訪問XFR
    j = T_SinTable[PWM_Index];
    if (過流)             ////////////     過流 降壓   
j=j*0.6              // 降壓為 原來0.6                              //////////////////////////
    PWM3T2H = (u8)(j >> 8);        //第二個翻轉計數高字節
    PWM3T2L  = (u8)j;                        //第二個翻轉計數低字節
    j += PWM_DeadZone;                //死區if(j==1220)                    ///////////    2個下管 輪流50HZ方波  p2.6 p.27初值,  要與 上管, 的初值 相反。
{  P 2.6=~P 2.6;
   P2.7=~P2.7;
}
    // 指向PWM4   PWM4T2H = (u8)(j >> 8);        //第二個翻轉計數高字節
    PWM4T2L = (u8)j;                        //第二個翻轉計數低字節
    P_SW2 = SW2_tmp;        //恢復SW2設置
    if(++PWM_Index >= 200)   
    PWM_Index = 0;
  
  }
}


回復

使用道具 舉報

23#
ID:844772 發表于 2021-12-28 09:09 | 只看該作者
你仔細研究T_SinTable[]就發現,它有兩個1220,按你4個0的說法,T_SinTable[]第一個1220是上個波末和這個波初的兩個零,中間一個1220時同一個波上半周和下半周的兩個零。
你務必用示波器看一下,特別是看一下死區對不對,再加負載啊,覺得程序還不很成熟。
另外驅動電飯鍋也就算了,卷簾門是感性電路啊
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黄色在线免费观看 | 欧美自拍另类 | 亚洲精彩视频在线观看 | 亚洲第1页 | 欧美日韩国产在线观看 | 欧美一区二区三区视频在线 | 欧美成人手机视频 | 日韩高清成人 | 亚洲成人高清 | 久久五月婷 | 中文字幕不卡一区 | 亚洲精品欧美 | 色综合天天天天做夜夜夜夜做 | 成人欧美一区二区三区 | 国产夜恋视频在线观看 | 久久久影院| 成人午夜精品 | 国产精品久久久久久久久久了 | 黄色在线观看国产 | chengrenzaixian| www国产亚洲精品 | 香蕉久久av | 在线欧美一区二区 | 国产成人99久久亚洲综合精品 | 国产精品视频一二三区 | 久久日本 | 亚洲欧美另类在线观看 | 成人福利影院 | 成人毛片网| 色欧美片视频在线观看 | 久久精品黄色 | 人成精品 | 粉嫩一区二区三区四区公司1 | 永久精品 | 91精品国产一区二区三区 | 国产永久免费 | 成年人网站在线观看视频 | 国产农村妇女毛片精品久久麻豆 | 日本特黄a级高清免费大片 国产精品久久性 | 国产成人jvid在线播放 | 国产精品永久久久久 |