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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC8A8K64S4A12單片機編寫的SPWM,帶軟啟動. 沒測試

[復制鏈接]
跳轉到指定樓層
樓主
ID:675799 發表于 2023-9-5 17:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
//一個SPWM帶有死區的程序 用STC8A8K64S4A12單片機編寫的SPWM
//介紹了一種高性能微機控制的單相 SPWM 變頻調速系統  24000000L 增強型PWM
// SPWM信號經低通濾波后可變換為正弦波,窄帶范圍內的方波經低通濾波后可變換為相應頻率的正弦波
//主時鐘選擇24MHZ, PWM時鐘選擇1T, PWM周期2400, 死區24個時鐘(1us).正弦波表用200點.
//輸出正弦波頻率 = 24000000/ 2400 / 200 = 50 HZ.                   PWMC = 2400;
//PWM4輸出選擇P2.2          // PWM3輸出選擇P2.3, 無中斷
//程序能用,如果不是你想要的頻率,那就 自己改一下數據 記得同時要替換數組里面的值
#define         MAIN_Fosc                24000000L        //定義主時鐘
#include        "STC8.H"
#include "intrins.h"           // _nop這個操作數用,ADC的。
unsigned int code T_SinTable[]={                                                   //50HZ         115幅值, 調制度10
1220, 1256, 1292, 1328, 1364, 1400, 1435, 1471, 1506, 1541,
1575, 1610, 1643, 1677, 1710, 1742, 1774, 1805, 1836, 1866,
1896, 1925, 1953, 1981, 2007, 2033, 2058, 2083, 2106, 2129,
2150, 2171, 2191, 2210, 2228, 2245, 2261, 2275, 2289, 2302,
2314, 2324, 2334, 2342, 2350, 2356, 2361, 2365, 2368, 2369,
2370, 2369, 2368, 2365, 2361, 2356, 2350, 2342, 2334, 2324,
2314, 2302, 2289, 2275, 2261, 2245, 2228, 2210, 2191, 2171,
2150, 2129, 2106, 2083, 2058, 2033, 2007, 1981, 1953, 1925,
1896, 1866, 1836, 1805, 1774, 1742, 1710, 1677, 1643, 1610,
1575, 1541, 1506, 1471, 1435, 1400, 1364, 1328, 1292, 1256,
1220, 1184, 1148, 1112, 1076, 1040, 1005, 969, 934, 899,
865, 830, 797, 763, 730, 698, 666, 635, 604, 574,
544, 515, 487, 459, 433, 407, 382, 357, 334, 311,
290, 269, 249, 230, 212, 195, 179, 165, 151, 138,
126, 116, 106, 98, 90, 84, 79, 75, 72, 71,
70, 71, 72, 75, 79, 84, 90, 98, 106, 116,
126, 138, 151, 165, 179, 195, 212, 230, 249, 269,
290, 311, 334, 357, 382, 407, 433, 459, 487, 515,
544, 574, 604, 635, 666, 698, 730, 763, 797, 830,
865, 899, 934, 969, 1005, 1040, 1076, 1112, 1148, 1184,
};
unsigned int code T_SinTable2[]={                                                   //50HZ         105幅值, 調制度10
1220,1252,1285,1318,1351,1384,1416,1449,1481,1512,
1544,1575,1606,1637,1667,1696,1725,1754,1782,1810,
1837,1863,1889,1914,1938,1962,1985,2007,2029,2049,
2069,2088,2106,2123,2140,2155,2170,2183,2196,2207,
2218,2228,2237,2244,2251,2257,2261,2265,2267,2269,
2270,2269,2267,2265,2261,2257,2251,2244,2237,2228,
2218,2207,2196,2183,2170,2155,2140,2123,2106,2088,
2069,2049,2029,2007,1985,1962,1938,1914,1889,1863,
1837,1810,1782,1754,1725,1696,1667,1637,1606,1575,
1544,1512,1481,1449,1416,1384,1351,1318,1285,1252,
1220,1187,1154,1121,1088,1055,1023,990,958,927,
895,864,833,802,772,743,714,685,657,629,
602,576,550,525,501,477,454,432,410,390,
370,351,333,316,299,284,269,256,243,232,
221,211,202,195,188,182,178,174,172,170,
170,170,172,174,178,182,188,195,202,211,
221,232,243,256,269,284,299,316,333,351,
370,390,410,432,454,477,501,525,550,576,
602,629,657,685,714,743,772,802,833,864,
895,927,958,990,1023,1055,1088,1121,1154,1187
};
unsigned int code T_SinTable3[]={                                                   //50HZ         95幅值, 調制度10
1220,1249,1279,1309,1339,1368,1398,1427,1456,1485,
1513,1541,1569,1597,1624,1651,1677,1703,1729,1753,
1778,1802,1825,1848,1870,1891,1912,1932,1951,1970,
1988,2005,2022,2037,2052,2066,2079,2091,2103,2113,
2123,2132,2140,2147,2153,2158,2162,2165,2168,2169,
2170,2169,2168,2165,2162,2158,2153,2147,2140,2132,
2123,2113,2103,2091,2079,2066,2052,2037,2022,2005,
1988,1970,1951,1932,1912,1891,1870,1848,1825,1802,
1778,1753,1729,1703,1677,1651,1624,1597,1569,1541,
1513,1485,1456,1427,1398,1368,1339,1309,1279,1249,
1220,1190,1160,1130,1100,1071,1041,1012,983,954,
926,898,870,842,815,788,762,736,710,686,
661,637,614,591,569,548,527,507,488,469,
451,434,417,402,387,373,360,348,336,326,
316,307,299,292,286,281,277,274,271,270,
270,270,271,274,277,281,286,292,299,307,
316,326,336,348,360,373,387,402,417,434,
451,469,488,507,527,548,569,591,614,637,
661,686,710,736,762,788,815,842,870,898,
926,954,983,1012,1041,1071,1100,1130,1160,1190 };

unsigned int code T_SinTable4[]={                                                   //50HZ         85幅值, 調制度10
1220,1246,1273,1299,1326,1352,1379,1405,1431,1457,
1482,1507,1532,1557,1581,1605,1629,1652,1675,1697,
1719,1740,1761,1782,1801,1821,1839,1857,1874,1891,
1907,1923,1937,1951,1964,1977,1989,2000,2010,2019,
2028,2036,2043,2049,2054,2059,2063,2066,2068,2069,
2070,2069,2068,2066,2063,2059,2054,2049,2043,2036,
2028,2019,2010,2000,1989,1977,1964,1951,1937,1923,
1907,1891,1874,1857,1839,1821,1801,1782,1761,1740,
1719,1697,1675,1652,1629,1605,1581,1557,1532,1507,
1482,1457,1431,1405,1379,1352,1326,1299,1273,1246,
1220,1193,1166,1140,1113,1087,1060,1034,1008,982,
957,932,907,882,858,834,810,787,764,742,
720,699,678,657,638,618,600,582,565,548,
532,516,502,488,475,462,450,439,429,420,
411,403,396,390,385,380,376,373,371,370,
370,370,371,373,376,380,385,390,396,403,
411,420,429,439,450,462,475,488,502,516,
532,548,565,582,600,618,638,657,678,699,
720,742,764,787,810,834,858,882,907,932,
957,982,1008,1034,1060,1087,1113,1140,1166,1193
  };
unsigned int code T_SinTable5[]={                                                   //50HZ         75幅值, 調制度10
1220,1243,1267,1290,1313,1337,1360,1383,1406,1429,
1451,1474,1496,1517,1539,1560,1581,1601,1621,1641,
1660,1679,1698,1715,1733,1750,1766,1782,1797,1812,
1826,1840,1853,1865,1877,1888,1898,1908,1917,1925,
1933,1940,1946,1951,1956,1960,1964,1966,1968,1969,
1970,1969,1968,1966,1964,1960,1956,1951,1946,1940,
1933,1925,1917,1908,1898,1888,1877,1865,1853,1840,
1826,1812,1797,1782,1766,1750,1733,1715,1698,1679,
1660,1641,1621,1601,1581,1560,1539,1517,1496,1474,
1451,1429,1406,1383,1360,1337,1313,1290,1267,1243,
1220,1196,1172,1149,1126,1102,1079,1056,1033,1010,
988,965,943,922,900,879,858,838,818,798,
779,760,741,724,706,689,673,657,642,627,
613,599,586,574,562,551,541,531,522,514,
506,499,493,488,483,479,475,473,471,470,
470,470,471,473,475,479,483,488,493,499,
506,514,522,531,541,551,562,574,586,599,
613,627,642,657,673,689,706,724,741,760,
779,798,818,838,858,879,900,922,943,965,
988,1010,1033,1056,1079,1102,1126,1149,1172,1196
};
unsigned int code T_SinTable6[]={                                                   //50HZ         65幅值, 調制度10
1220,1240,1260,1281,1301,1321,1341,1361,1381,1401,
1420,1440,1459,1478,1496,1515,1533,1550,1568,1585,
1602,1618,1634,1649,1664,1679,1693,1707,1720,1733,
1745,1757,1768,1779,1789,1799,1808,1816,1824,1831,
1838,1844,1849,1854,1858,1861,1864,1867,1868,1869,
1870,1869,1868,1867,1864,1861,1858,1854,1849,1844,
1838,1831,1824,1816,1808,1799,1789,1779,1768,1757,
1745,1733,1720,1707,1693,1679,1664,1649,1634,1618,
1602,1585,1568,1550,1533,1515,1496,1478,1459,1440,
1420,1401,1381,1361,1341,1321,1301,1281,1260,1240,
1220,1199,1179,1158,1138,1118,1098,1078,1058,1038,
1019,999,980,961,943,924,906,889,871,854,
837,821,805,790,775,760,746,732,719,706,
694,682,671,660,650,640,631,623,615,608,
601,595,590,585,581,578,575,572,571,570,
570,570,571,572,575,578,581,585,590,595,
601,608,615,623,631,640,650,660,671,682,
694,706,719,732,746,760,775,790,805,821,
837,854,871,889,906,924,943,961,980,999,
1019,1038,1058,1078,1098,1118,1138,1158,1179,1199
};
unsigned int code T_SinTable7[]={                                                   //50HZ         55幅值, 調制度10
1220,1237,1254,1271,1288,1306,1323,1339,1356,1373,
1389,1406,1422,1438,1454,1469,1484,1499,1514,1529,
1543,1557,1570,1583,1596,1608,1620,1632,1643,1654,
1664,1674,1684,1693,1701,1710,1717,1724,1731,1737,
1743,1748,1752,1756,1760,1763,1765,1767,1768,1769,
1770,1769,1768,1767,1765,1763,1760,1756,1752,1748,
1743,1737,1731,1724,1717,1710,1701,1693,1684,1674,
1664,1654,1643,1632,1620,1608,1596,1583,1570,1557,
1543,1529,1514,1499,1484,1469,1454,1438,1422,1406,
1389,1373,1356,1339,1323,1306,1288,1271,1254,1237,
1220,1202,1185,1168,1151,1133,1116,1100,1083,1066,
1050,1033,1017,1001,985,970,955,940,925,910,
896,882,869,856,843,831,819,807,796,785,
775,765,755,746,738,729,722,715,708,702,
696,691,687,683,679,676,674,672,671,670,
670,670,671,672,674,676,679,683,687,691,
696,702,708,715,722,729,738,746,755,765,
775,785,796,807,819,831,843,856,869,882,
896,910,925,940,955,970,985,1001,1017,1033,
1050,1066,1083,1100,1116,1133,1151,1168,1185,1202
};
unsigned int code T_SinTable8[]={                                                   //50HZ         45幅值, 調制度10
1220,1234,1248,1262,1276,1290,1304,1318,1331,1345,
1359,1372,1385,1398,1411,1424,1436,1449,1461,1472,
1484,1495,1506,1517,1528,1538,1548,1557,1566,1575,
1584,1592,1599,1607,1614,1620,1627,1632,1638,1643,
1647,1652,1655,1659,1662,1664,1666,1668,1669,1669,
1670,1669,1669,1668,1666,1664,1662,1659,1655,1652,
1647,1643,1638,1632,1627,1620,1614,1607,1599,1592,
1584,1575,1566,1557,1548,1538,1528,1517,1506,1495,
1484,1472,1461,1449,1436,1424,1411,1398,1385,1372,
1359,1345,1331,1318,1304,1290,1276,1262,1248,1234,
1220,1205,1191,1177,1163,1149,1135,1121,1108,1094,
1080,1067,1054,1041,1028,1015,1003,990,978,967,
955,944,933,922,911,901,891,882,873,864,
855,847,840,832,825,819,812,807,801,796,
792,787,784,780,777,775,773,771,770,770,
770,770,770,771,773,775,777,780,784,787,
792,796,801,807,812,819,825,832,840,847,
855,864,873,882,891,901,911,922,933,944,
955,967,978,990,1003,1015,1028,1041,1054,1067,
1080,1094,1108,1121,1135,1149,1163,1177,1191,1205
};               
         
unsigned int code T_SinT[]={          //50HZ         35幅值, 調制度10         //第一次啟動用, 以后當臨時數組。
1220,1230,1241,1252,1263,1274,1285,1296,1307,1317,
1328,1338,1348,1359,1369,1378,1388,1398,1407,1416,
1425,1434,1443,1451,1459,1467,1475,1482,1489,1496,
1503,1509,1515,1521,1526,1531,1536,1541,1545,1549,
1552,1556,1559,1561,1563,1565,1567,1568,1569,1569,
1570,1569,1569,1568,1567,1565,1563,1561,1559,1556,
1552,1549,1545,1541,1536,1531,1526,1521,1515,1509,
1503,1496,1489,1482,1475,1467,1459,1451,1443,1434,
1425,1416,1407,1398,1388,1378,1369,1359,1348,1338,
1328,1317,1307,1296,1285,1274,1263,1252,1241,1230,
1220,1209,1198,1187,1176,1165,1154,1143,1132,1122,
1111,1101,1091,1080,1070,1061,1051,1041,1032,1023,
1014,1005,996,988,980,972,964,957,950,943,
936,930,924,918,913,908,903,898,894,890,
887,883,880,878,876,874,873,872,871,871,
870,871,871,872,873,874,876,878,880,883,
887,890,894,898,903,908,913,918,924,930,
936,943,950,957,964,972,980,988,996,1005,
1014,1023,1032,1041,1051,1061,1070,1080,1091,1101,
1111,1122,1132,1143,1154,1165,1176,1187,1198,1209
          };        
#define        PwmClk_1T        0
#define        PwmClk_2T        1
#define        PwmClk_3T        2
#define        PwmClk_4T        3
#define        PwmClk_5T        4
#define        PwmClk_6T        5
#define        PwmClk_7T        6
#define        PwmClk_8T        7
#define        PwmClk_9T        8
#define        PwmClk_10T        9
#define        PwmClk_11T        10
#define        PwmClk_12T        11
#define        PwmClk_13T        12
#define        PwmClk_14T        13
#define        PwmClk_15T        14
#define        PwmClk_16T        15
#define        PwmClk_T2        16
#define        EAXSFR()                P_SW2 |=  0x80        /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作對象為擴展SFR(XSFR) */
#define        EAXRAM()                P_SW2 &= ~0x80        /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作對象為擴展RAM(XRAM) */
#define        PWM_Enable()        PWMCR |=  0x80        /* 使能PWM波形發生器,PWM計數器開始計數 */
#define        PWM_Disable()        PWMCR &= ~0x80        /* 關閉PWM波形發生器 */
#define P2n_standard(bitn)                        P2M1 &= ~(bitn),        P2M0 &= ~(bitn)
#define P2n_push_pull(bitn)                        P2M1 &= ~(bitn),        P2M0 |=  (bitn)
#define P2n_pure_input(bitn)                P2M1 |=  (bitn),        P2M0 &= ~(bitn)
#define P2n_open_drain(bitn)                P2M1 |=  (bitn),        P2M0 |=  (bitn)
#define                PWM_VECTOR                22
#define                PWM_DeadZone        24       /* 死區時鐘數, 6 ~ 24之間 24個時鐘是 1us */
typedef unsigned char         u8;
typedef unsigned int          u16;
typedef unsigned long         u32;

sbit LED_OUT =P3^3;
#define Port P1                         //設置CPU和模塊的通訊接口
u8        PWM_Index;        //SPWM查表索引
u8   dt4 ; // 4秒內或 10次過流啟動。
  u16 dtt;//開機標志



//sfr P2M0 = 0x96;         //P2口引腳模式寄存器
//sfr P1M0 = 0x92;         //P1口引腳模式寄存器
//sfr ADCCFG          = 0xDE;//   ADC 配置寄存器 DEH - - RESFMT - SPEED[3:0] xx0x,0000           RESFMT:ADC 轉換結果格式控制位,默認左對齊。
//sfr ADC_CONTR = 0xBC;//A/D 轉換控制寄存器 ADC_POWER ADC_START ADC_FLAG - ADC_CHS[3:0]  ADC_POWER,SPEED1,SPEED0,ADC_FLAG,ADC_START,CHS2,CHS1,CHS0;0000,0000
//sfr ADC_RES   = 0xBD;//A/D 轉換結果高8位  ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2;0000,0000
//sfr ADC_RESL  = 0xBE;//A/D 轉換結果低2位                                            ADCV.1 ADCV.0;0000,0000



//sfr ADC_CHS[3:0] = 0x07        ;         //第 x.7通道
#define ADC_POWER        0x80        //ADC電源控制位
#define ADC_FLAG        0x20        //ADC完成標志位
#define ADC_START        0x40        //ADC啟動控制位        #define ADC_START        0x08
#define ADC_SPEED0        0x02        //ADC轉換速度,一次轉換需要96個時鐘
#define ADC_SPEED1        0x05        //ADC轉換速度,一次轉換需要192個時鐘
#define ADC_SPEED2        0x0b        //ADC轉換速度,一次轉換需要364個時鐘
#define ADC_SPEED3        0x0f        //ADC轉換速度,一次轉換需要512個時鐘
#define N 8        //ADC采樣使用遞推平均濾波算法,采樣次數
/******************************
函數說明:初始化ADC寄存器,設置P1.7為ADC輸入功能
入口參數:無
出口參數:無
******************************/
void Init_ADC(void)
{   P1M0=0x00;
    P1M1=0x80;//  P1ASF = 0x80;                //打開P1.7口的ADC功能 (1000 0000 )
        ADC_RES = 0;        
        ADC_RESL= 0;                //清掉ADC轉換結果寄存器
    ADC_CONTR = ADC_POWER ;        //使能A/D供電,

        ADCCFG=        ADC_SPEED3;        //設置轉換速度90T  不設置速度, 采用PWM 計數器觸發采樣點。硬件自動觸發 A/D 轉換
   //sfr ADCCFG          = 0xDE;//   ADC 配置寄存器 DEH - - RESFMT - SPEED[3:0] xx0x,0000           RESFMT:ADC 轉換結果格式控制位,默認左對齊。
//sfr ADC_CONTR = 0xBC;//A/D 轉換控制寄存器 ADC_POWER ADC_START ADC_FLAG - ADC_CHS[3:0]  ADC_POWER,SPEED1,SPEED0,ADC_FLAG,ADC_START,CHS2,CHS1,CHS0;0000,0000


}

/******************************
函數說明:查詢方式讀取ADC轉換結果
入口參數:ch  ADC采樣通道
出口參數:int ADC_RES ADC轉換結果
******************************/
unsigned int Get_ADC_Result(unsigned char ch)
{
        unsigned int result;   //u16
        result =0 ;
        ADC_RES = 0;        
        ADC_RESL= 0;                                        //清掉ADC轉換結果寄存器
        ADCCFG=        ADC_SPEED3;
        ADC_CONTR =ADC_POWER|ADC_START|ch;//配置ADC,設置轉換通道,啟動轉換        /A/D 轉換控制寄存器 ADC_POWER ADC_START ADC_FLAG - ADC_CHS[3:0]
    _nop_();        _nop_();
    _nop_();        _nop_();                        //等待設置ADC_POWER完畢
    while (!(ADC_CONTR & ADC_FLAG));//讀取轉換完畢標志位ADC_FLAG
    ADC_CONTR &= ~ADC_FLAG;         //清除ADC_FLAG標志位
        result = ADC_RES<<4|ADC_RESL;        //讀取12位轉換結果保存到result
    return result;                  //返回ADC轉換結果12位
}
/******************************/

/******************************/
void Delay1000ms()                //@24.000MHz
{
        unsigned char data i, j, k;

        _nop_();
        _nop_();
        i = 92;
        j = 50;
        k = 238;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
//========================================================================
// 函數: void        PWM_config(void)
// 描述: PWM配置函數。
// 參數: none.
// 返回: none.
// 版本: VER1.0
// 日期:
// 備注:
//========================================================================
void        PWM_config(void)
{
  EAXSFR();                        // 訪問XFR
  PWM3T1 = 65; // 第一個翻轉計數
  PWM3T2=1220;         // 第二個翻轉計數
  PWM3CR =0;         // PWM3輸出選擇P2.3, 無中斷    pwm切換  有端口介紹(固定幾個口)
  PWM3CR  |=  0x80;        // 相應PWM通道的端口為PWM輸出口,受PWM波形發生器控制 ENC30
  PWM3CR &= ~0x40;        // 設置PWM輸出端口的初始電平為0 C3INI
  P23 = 0;
  P2n_push_pull(1<<3);        //IO初始化, 上電時為高阻
  PWM4T1= 65-PWM_DeadZone;                        // 第一個翻轉計數低字節
  PWM4T2 = (1220+PWM_DeadZone); // 第二個翻轉計數高字節
  PWM4CR = 0;        // PWM4輸出選擇P2.2, 無中斷
  PWM4CR  |=  0x80;        // 相應PWM通道的端口為PWM輸出口,受PWM波形發生器控制 ENC40
  //        PWMCFG &= ~0x04;        // 設置PWM輸出端口的初始電平為0  C4INI
  PWM4CR |=  0x40;        // 設置PWM輸出端口的初始電平為1
  P24 = 1;
  P2n_push_pull(1<<4);        //IO初始化, 上電時為高阻
  PWMC = 2400;        // PWM計數器的高字節           2550 為47HZ  2666為45HZ,   2400為50HZ
     P26 = 0;                   //MOS管下臂
         P27 = 0;                   //MOS管下臂
  PWMCKS = PwmClk_1T;        // 時鐘源: PwmClk_1T,PwmClk_2T, ... PwmClk_16T, PwmClk_Timer2
   IP2H=PPWMFDH; //pwm異常檢測寄存器高位1, 為第3級。 ( 可以設置最高級4,加上 IP2=PPWMFD;) //設置PWM異常檢測優先級3
  EAXRAM();                        // 恢復訪問XRAM
////////////////////////////////
  PWMFDCR = ENFD  | FDIO; //PWM失效中斷控制,  FLTFLIO=1發生 WM 外部異常時,PWM 的輸出口立即被置為高阻模式??
            //FDIO==1 , 為P35,做為中斷異常檢測口;void PWMFD_Routine(void) interrupt 23;
  PWMCR |= ENPWM;                // 使能PWM波形發生器,PWM計數器開始計數
  //        PWMCR &= ~ECBI;                // 禁止PWM計數器歸零中斷
  PWMCR |=  ECBI;                // 允許PWM計數器歸零中斷


  PWMCFG=0x20 ; //ETADC  1:PWM 與 ADC 相關聯。允許在 PWM 周期中某個時間點觸發 A/D 轉換。使用 TADCPH 和 TADCPL進行設置。
        //           在 ETADC=1 且 ADC_POWER=1 時,{TADCPH,TADCPL}組成一個 15 位的寄存器。在 PWM 的計數周
//期中,當 PWM 的內部計數值與{TADCPH,TADCPL}的值相等時,硬件自動觸發 A/D 轉換
   TADCPL=0x80;
   TADCPH =0x01;                                  //2400 pwm總計數2400 ;    600點 1800就是2個上下最大計數值。 取600。
}
//**********************************************/
                                                                                                           

/**********************************************/

void main(void)
{   u16 hvv,haa ;         //高壓交流電壓, 交流電流;
     u16 mvv; //直流320V 母線電壓
         u8 g;
         dtt=0; //開機啟動標志0

     PWM_Index = 0;                                                            

     LED_OUT =1;   //單片機開機指示
//         P35=0;         //MOS管 S過流電阻 , 過流==1   P35異常檢測口
     P01=0;        //互感線圈過流         
     P02=0;           
     P03=0;          //不過流,溫度高
         P04=0;   //溫度高的,LED接口,指示用;
         P12=0;  //交流電壓反饋           2.5V ==230v 輸出有效值(最大值)ADC2 通道         ,這里用TL432的外部基準2.5v
         P17=0; //交流 電流反饋           2.5v ==8A  電流         (最大值)          adc7 通道
         P14=0; // 直流母線電壓反饋 端口電阻分壓到2.5V (最大值) =350V

             P1M0 &= ~0x94; P1M1 |= 0x94; //         //打開P17,P14 ,P12口的ADC功能(adc是高阻輸入模式)
             Init_ADC();
                   PWM_config();        //初始化PWM    50hZ
         EA = 1;                //允許全局中斷
                   PWM_Enable()   ;
            

  while (1)
  {                   hvv= Get_ADC_Result(2);        //將ADC P12電壓調整,輸出脈沖。讓電流 在合理范圍。
                haa= Get_ADC_Result(7);        //將ADC P17電壓調整,輸出脈沖。讓電流 在合理范圍。
            mvv= Get_ADC_Result(4);        //將ADC P14電壓調整,輸出脈沖。讓電流 在合理范圍。
                mvv=2.5*mvv/4069;  //外部基準為2.5v, 所以P14口,直流母線真是電壓值 (母線電壓有電阻分壓到2.5V,經過LM358運放 給P14.)   
                //這個真實值 到底mvv單位是V??? 還是mv ??????????????          如果直流母線電壓大于385V,也LED提示。
                if(mvv<2.25||mvv>2.75)          //2.4v還是2400mv實際測試決定一下。。。。。。
                { P02=1; } //P02接LED指示350v母線電壓偏低,或者沒有電壓,或者電壓大于385V
                 else { P02=0; } ;
               
               
                 if( P03==1) //溫度高,停機或延時幾十秒,啟動。 由熱敏電阻,檢測后經LM358,送3v高電平到 p03口。
                   {     PWM_Disable() ; //關閉 PWM
                         PWM_Index=0;
                             P26=0;   P27=0;         //關閉2個 P26 P27方波口。
                                for(  g=1;g++;g<100)
                                {Delay1000ms();
                                P04= ~P04;    //LED指示閃,表示溫度高; 冷卻中;
                                
                                }  //冷卻100秒再開機;
                                
                                 PWM_config();
                                 dtt=999;       //開機標志   
                                 PWM_Enable()   ;
                   }
                  
                  
                  
                   if(dt4==1)                                 //異常處理完后,再開機 主要是過流異常。
                        {
                               //其他需要處理異常的語句,在此加入。
                         dtt=0;         //二次降壓開機模式 ,一樣標志為999
                         PWM_config();        //初始化PWM    50hZ                     
                         PWM_Enable()   ;
                        
                         }
                  

  }
}
/********************* PWM中斷函數************************/
void PWM_int (void) interrupt PWM_VECTOR
{        
  u16      j,  k;
  u8        SW2_tmp;
  if(PWMCFG & CBIF)        //PWM計數器歸零中斷標志 PWMCFG
  {
    PWMCFG &= ~CBIF;        //清除中斷標志
    SW2_tmp = P_SW2;        //保存SW2設置
    EAXSFR();                //訪問XFR
                                   ////////////////////////////////////////////////////////////////////////////////////////
                                if(dt4==1||dtt<=200)//PWM異常處理 過流,完成后 。嘗試降壓啟動,數組用        ,開機啟動999也是從此開
                                {            dtt++; //開機標志999, dt4==1是過流,
                                        j=T_SinTable8[PWM_Index];        // 第一次,最低電壓啟動        8級        或沖擊電流大后,重新開機。
                                         dt4++;
                                }
                           if(dtt>200&&dtt<=400)                        //200點后,換波形                          // 第2個波形,低電壓 7        級
                           { j=T_SinTable7[PWM_Index];
                                  dtt++;
                                }
                                   if(dtt>400&&dtt<=600)                                                          // 第3個波形,低電壓啟動6        級
                           { j=T_SinTable6[PWM_Index];
                                   dtt++;
                                }
                                  if(dtt>600&&dtt<=800)                                                          // 第4,低電壓啟動5        級
                           { j=T_SinTable5[PWM_Index];
                                  dtt++        ;
                                }
                             if(dtt>=800&&dtt<1000)                                                                             // 第5波,低電壓啟動4        級                           { j=T_SinTable4[PWM_Index];
                                  dtt++        ;
                                }
                                 if(dtt>=1000&&dtt<1200)                                                  // 第6波,低電壓啟動3        級
                           { j=T_SinTable3[PWM_Index];
                                  dtt++        ;
                                }
                                 if(dtt>=1200&&dtt<1400)                                                          // 第7波,低電壓啟動2        級
                           { j=T_SinTable2[PWM_Index];
                                  dtt++;
                                }
                                                   if(dtt>=1400)                                                  // 第8波,低電壓啟動1        級
                           { j=T_SinTable[PWM_Index];
                                                                                   
                                 
                                }
                          ///////////////////////////////////////////////////////////////////////////
                          

        k = j ;

    PWM3T2H = (u8)(j >> 8);        //第二個翻轉計數高字節
    PWM3T2L  = (u8)j;              //第二個翻轉計數低字節
        
               
    j += PWM_DeadZone;                //死區

    // 指向PWM4
    PWM4T2H = (u8)(j >> 8);        //第二個翻轉計數高字節
    PWM4T2L = (u8)j;                        //第二個翻轉計數低字節
    P_SW2 = SW2_tmp;        //恢復SW2設置
                             
    if(++PWM_Index <= 200)   
             PWM_Index = 0;
  }                 
  ///////////////////////////
          if(PWM_Index<=99 )                   ///////////  每100個點  2個下管 輪流對應 40或45或 50hz方波  p2.6 p.27初值,  要與 上管, 的初值 相反。
{  P26=0;
           _nop_();
        _nop_();
   P27=1;
}
          if(PWM_Index>99 )
{        P26=1;
    _nop_();
        _nop_();
        P27=0;                                 
                }
                                                      
         }         
                 /********************* PWM異常中斷函數************************/
                 void PWMFD_Routine(void) interrupt 23
                {                if(         PWMFDCR  &=EFDI)
                         PWMFDCR  &=~EFDI  ;//清0 PWM異常檢測寄存器的EFDI異常標志。                 
                            PWM_Disable() ; //關閉 PWM
                          P26=0;   P27=0;         //關閉2個 P26 P27方波口。

                              dtt=0;   //          再從0起。
                                PWM_Index=0;        // 正弦波表,再從0起。
                                dt4=1;        //異常計數 開始
                           
                            P41=1;
                                 Delay1000ms();        //異常后延時1秒。
                                 P41=0;                        //P41可以接LED燈。
                                                                                                     
                                }
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:675799 發表于 2023-9-7 14:36 | 只看該作者
//一個SPWM帶有死區的程序 用STC8A8K64S4A12單片機編寫的SPWM
//介紹了一種高性能微機控制的單相 SPWM 變頻調速系統  24000000L 增強型PWM
// SPWM信號經低通濾波后可變換為正弦波,窄帶范圍內的方波經低通濾波后可變換為相應頻率的正弦波
//主時鐘選擇24MHZ, PWM時鐘選擇1T, PWM周期2400, 死區24個時鐘(1us).正弦波表用200點.
//輸出正弦波頻率 = 24000000/ 2400 / 200 = 50 HZ.                   PWMC = 2400;
//PWM4輸出選擇P2.4         // PWM3輸出選擇P2.3, 無中斷
//程序能用,如果不是你想要的頻率,那就 自己改一下數據 記得同時要替換數組里面的值
#define         MAIN_Fosc                24000000L        //定義主時鐘
#include        "STC8.H"
#include "intrins.h"           // _nop這個操作數用,ADC的。
unsigned int code T_SinTable[]={                                                   //50HZ         115幅值, 調制度10
1220, 1256, 1292, 1328, 1364, 1400, 1435, 1471, 1506, 1541,
1575, 1610, 1643, 1677, 1710, 1742, 1774, 1805, 1836, 1866,
1896, 1925, 1953, 1981, 2007, 2033, 2058, 2083, 2106, 2129,
2150, 2171, 2191, 2210, 2228, 2245, 2261, 2275, 2289, 2302,
2314, 2324, 2334, 2342, 2350, 2356, 2361, 2365, 2368, 2369,
2370, 2369, 2368, 2365, 2361, 2356, 2350, 2342, 2334, 2324,
2314, 2302, 2289, 2275, 2261, 2245, 2228, 2210, 2191, 2171,
2150, 2129, 2106, 2083, 2058, 2033, 2007, 1981, 1953, 1925,
1896, 1866, 1836, 1805, 1774, 1742, 1710, 1677, 1643, 1610,
1575, 1541, 1506, 1471, 1435, 1400, 1364, 1328, 1292, 1256,
1220, 1184, 1148, 1112, 1076, 1040, 1005, 969, 934, 899,
865, 830, 797, 763, 730, 698, 666, 635, 604, 574,
544, 515, 487, 459, 433, 407, 382, 357, 334, 311,
290, 269, 249, 230, 212, 195, 179, 165, 151, 138,
126, 116, 106, 98, 90, 84, 79, 75, 72, 71,
70, 71, 72, 75, 79, 84, 90, 98, 106, 116,
126, 138, 151, 165, 179, 195, 212, 230, 249, 269,
290, 311, 334, 357, 382, 407, 433, 459, 487, 515,
544, 574, 604, 635, 666, 698, 730, 763, 797, 830,
865, 899, 934, 969, 1005, 1040, 1076, 1112, 1148, 1184,
};
unsigned int code T_SinTable2[]={                                                   //50HZ         105幅值, 調制度10
1220,1252,1285,1318,1351,1384,1416,1449,1481,1512,
1544,1575,1606,1637,1667,1696,1725,1754,1782,1810,
1837,1863,1889,1914,1938,1962,1985,2007,2029,2049,
2069,2088,2106,2123,2140,2155,2170,2183,2196,2207,
2218,2228,2237,2244,2251,2257,2261,2265,2267,2269,
2270,2269,2267,2265,2261,2257,2251,2244,2237,2228,
2218,2207,2196,2183,2170,2155,2140,2123,2106,2088,
2069,2049,2029,2007,1985,1962,1938,1914,1889,1863,
1837,1810,1782,1754,1725,1696,1667,1637,1606,1575,
1544,1512,1481,1449,1416,1384,1351,1318,1285,1252,
1220,1187,1154,1121,1088,1055,1023,990,958,927,
895,864,833,802,772,743,714,685,657,629,
602,576,550,525,501,477,454,432,410,390,
370,351,333,316,299,284,269,256,243,232,
221,211,202,195,188,182,178,174,172,170,
170,170,172,174,178,182,188,195,202,211,
221,232,243,256,269,284,299,316,333,351,
370,390,410,432,454,477,501,525,550,576,
602,629,657,685,714,743,772,802,833,864,
895,927,958,990,1023,1055,1088,1121,1154,1187
};
unsigned int code T_SinTable3[]={                                                   //50HZ         95幅值, 調制度10
1220,1249,1279,1309,1339,1368,1398,1427,1456,1485,
1513,1541,1569,1597,1624,1651,1677,1703,1729,1753,
1778,1802,1825,1848,1870,1891,1912,1932,1951,1970,
1988,2005,2022,2037,2052,2066,2079,2091,2103,2113,
2123,2132,2140,2147,2153,2158,2162,2165,2168,2169,
2170,2169,2168,2165,2162,2158,2153,2147,2140,2132,
2123,2113,2103,2091,2079,2066,2052,2037,2022,2005,
1988,1970,1951,1932,1912,1891,1870,1848,1825,1802,
1778,1753,1729,1703,1677,1651,1624,1597,1569,1541,
1513,1485,1456,1427,1398,1368,1339,1309,1279,1249,
1220,1190,1160,1130,1100,1071,1041,1012,983,954,
926,898,870,842,815,788,762,736,710,686,
661,637,614,591,569,548,527,507,488,469,
451,434,417,402,387,373,360,348,336,326,
316,307,299,292,286,281,277,274,271,270,
270,270,271,274,277,281,286,292,299,307,
316,326,336,348,360,373,387,402,417,434,
451,469,488,507,527,548,569,591,614,637,
661,686,710,736,762,788,815,842,870,898,
926,954,983,1012,1041,1071,1100,1130,1160,1190 };

unsigned int code T_SinTable4[]={                                                   //50HZ         85幅值, 調制度10
1220,1246,1273,1299,1326,1352,1379,1405,1431,1457,
1482,1507,1532,1557,1581,1605,1629,1652,1675,1697,
1719,1740,1761,1782,1801,1821,1839,1857,1874,1891,
1907,1923,1937,1951,1964,1977,1989,2000,2010,2019,
2028,2036,2043,2049,2054,2059,2063,2066,2068,2069,
2070,2069,2068,2066,2063,2059,2054,2049,2043,2036,
2028,2019,2010,2000,1989,1977,1964,1951,1937,1923,
1907,1891,1874,1857,1839,1821,1801,1782,1761,1740,
1719,1697,1675,1652,1629,1605,1581,1557,1532,1507,
1482,1457,1431,1405,1379,1352,1326,1299,1273,1246,
1220,1193,1166,1140,1113,1087,1060,1034,1008,982,
957,932,907,882,858,834,810,787,764,742,
720,699,678,657,638,618,600,582,565,548,
532,516,502,488,475,462,450,439,429,420,
411,403,396,390,385,380,376,373,371,370,
370,370,371,373,376,380,385,390,396,403,
411,420,429,439,450,462,475,488,502,516,
532,548,565,582,600,618,638,657,678,699,
720,742,764,787,810,834,858,882,907,932,
957,982,1008,1034,1060,1087,1113,1140,1166,1193
  };
unsigned int code T_SinTable5[]={                                                   //50HZ         75幅值, 調制度10
1220,1243,1267,1290,1313,1337,1360,1383,1406,1429,
1451,1474,1496,1517,1539,1560,1581,1601,1621,1641,
1660,1679,1698,1715,1733,1750,1766,1782,1797,1812,
1826,1840,1853,1865,1877,1888,1898,1908,1917,1925,
1933,1940,1946,1951,1956,1960,1964,1966,1968,1969,
1970,1969,1968,1966,1964,1960,1956,1951,1946,1940,
1933,1925,1917,1908,1898,1888,1877,1865,1853,1840,
1826,1812,1797,1782,1766,1750,1733,1715,1698,1679,
1660,1641,1621,1601,1581,1560,1539,1517,1496,1474,
1451,1429,1406,1383,1360,1337,1313,1290,1267,1243,
1220,1196,1172,1149,1126,1102,1079,1056,1033,1010,
988,965,943,922,900,879,858,838,818,798,
779,760,741,724,706,689,673,657,642,627,
613,599,586,574,562,551,541,531,522,514,
506,499,493,488,483,479,475,473,471,470,
470,470,471,473,475,479,483,488,493,499,
506,514,522,531,541,551,562,574,586,599,
613,627,642,657,673,689,706,724,741,760,
779,798,818,838,858,879,900,922,943,965,
988,1010,1033,1056,1079,1102,1126,1149,1172,1196
};
unsigned int code T_SinTable6[]={                                                   //50HZ         65幅值, 調制度10
1220,1240,1260,1281,1301,1321,1341,1361,1381,1401,
1420,1440,1459,1478,1496,1515,1533,1550,1568,1585,
1602,1618,1634,1649,1664,1679,1693,1707,1720,1733,
1745,1757,1768,1779,1789,1799,1808,1816,1824,1831,
1838,1844,1849,1854,1858,1861,1864,1867,1868,1869,
1870,1869,1868,1867,1864,1861,1858,1854,1849,1844,
1838,1831,1824,1816,1808,1799,1789,1779,1768,1757,
1745,1733,1720,1707,1693,1679,1664,1649,1634,1618,
1602,1585,1568,1550,1533,1515,1496,1478,1459,1440,
1420,1401,1381,1361,1341,1321,1301,1281,1260,1240,
1220,1199,1179,1158,1138,1118,1098,1078,1058,1038,
1019,999,980,961,943,924,906,889,871,854,
837,821,805,790,775,760,746,732,719,706,
694,682,671,660,650,640,631,623,615,608,
601,595,590,585,581,578,575,572,571,570,
570,570,571,572,575,578,581,585,590,595,
601,608,615,623,631,640,650,660,671,682,
694,706,719,732,746,760,775,790,805,821,
837,854,871,889,906,924,943,961,980,999,
1019,1038,1058,1078,1098,1118,1138,1158,1179,1199
};
unsigned int code T_SinTable7[]={                                                   //50HZ         55幅值, 調制度10
1220,1237,1254,1271,1288,1306,1323,1339,1356,1373,
1389,1406,1422,1438,1454,1469,1484,1499,1514,1529,
1543,1557,1570,1583,1596,1608,1620,1632,1643,1654,
1664,1674,1684,1693,1701,1710,1717,1724,1731,1737,
1743,1748,1752,1756,1760,1763,1765,1767,1768,1769,
1770,1769,1768,1767,1765,1763,1760,1756,1752,1748,
1743,1737,1731,1724,1717,1710,1701,1693,1684,1674,
1664,1654,1643,1632,1620,1608,1596,1583,1570,1557,
1543,1529,1514,1499,1484,1469,1454,1438,1422,1406,
1389,1373,1356,1339,1323,1306,1288,1271,1254,1237,
1220,1202,1185,1168,1151,1133,1116,1100,1083,1066,
1050,1033,1017,1001,985,970,955,940,925,910,
896,882,869,856,843,831,819,807,796,785,
775,765,755,746,738,729,722,715,708,702,
696,691,687,683,679,676,674,672,671,670,
670,670,671,672,674,676,679,683,687,691,
696,702,708,715,722,729,738,746,755,765,
775,785,796,807,819,831,843,856,869,882,
896,910,925,940,955,970,985,1001,1017,1033,
1050,1066,1083,1100,1116,1133,1151,1168,1185,1202
};
unsigned int code T_SinTable8[]={                                                   //50HZ         45幅值, 調制度10
1220,1234,1248,1262,1276,1290,1304,1318,1331,1345,
1359,1372,1385,1398,1411,1424,1436,1449,1461,1472,
1484,1495,1506,1517,1528,1538,1548,1557,1566,1575,
1584,1592,1599,1607,1614,1620,1627,1632,1638,1643,
1647,1652,1655,1659,1662,1664,1666,1668,1669,1669,
1670,1669,1669,1668,1666,1664,1662,1659,1655,1652,
1647,1643,1638,1632,1627,1620,1614,1607,1599,1592,
1584,1575,1566,1557,1548,1538,1528,1517,1506,1495,
1484,1472,1461,1449,1436,1424,1411,1398,1385,1372,
1359,1345,1331,1318,1304,1290,1276,1262,1248,1234,
1220,1205,1191,1177,1163,1149,1135,1121,1108,1094,
1080,1067,1054,1041,1028,1015,1003,990,978,967,
955,944,933,922,911,901,891,882,873,864,
855,847,840,832,825,819,812,807,801,796,
792,787,784,780,777,775,773,771,770,770,
770,770,770,771,773,775,777,780,784,787,
792,796,801,807,812,819,825,832,840,847,
855,864,873,882,891,901,911,922,933,944,
955,967,978,990,1003,1015,1028,1041,1054,1067,
1080,1094,1108,1121,1135,1149,1163,1177,1191,1205
};               
         
unsigned int code T_SinT[]={          //50HZ         35幅值, 調制度10         //第一次啟動用, 以后當臨時數組。
1220,1230,1241,1252,1263,1274,1285,1296,1307,1317,
1328,1338,1348,1359,1369,1378,1388,1398,1407,1416,
1425,1434,1443,1451,1459,1467,1475,1482,1489,1496,
1503,1509,1515,1521,1526,1531,1536,1541,1545,1549,
1552,1556,1559,1561,1563,1565,1567,1568,1569,1569,
1570,1569,1569,1568,1567,1565,1563,1561,1559,1556,
1552,1549,1545,1541,1536,1531,1526,1521,1515,1509,
1503,1496,1489,1482,1475,1467,1459,1451,1443,1434,
1425,1416,1407,1398,1388,1378,1369,1359,1348,1338,
1328,1317,1307,1296,1285,1274,1263,1252,1241,1230,
1220,1209,1198,1187,1176,1165,1154,1143,1132,1122,
1111,1101,1091,1080,1070,1061,1051,1041,1032,1023,
1014,1005,996,988,980,972,964,957,950,943,
936,930,924,918,913,908,903,898,894,890,
887,883,880,878,876,874,873,872,871,871,
870,871,871,872,873,874,876,878,880,883,
887,890,894,898,903,908,913,918,924,930,
936,943,950,957,964,972,980,988,996,1005,
1014,1023,1032,1041,1051,1061,1070,1080,1091,1101,
1111,1122,1132,1143,1154,1165,1176,1187,1198,1209
          };        
#define        PwmClk_1T        0
#define        PwmClk_2T        1
#define        PwmClk_3T        2
#define        PwmClk_4T        3
#define        PwmClk_5T        4
#define        PwmClk_6T        5
#define        PwmClk_7T        6
#define        PwmClk_8T        7
#define        PwmClk_9T        8
#define        PwmClk_10T        9
#define        PwmClk_11T        10
#define        PwmClk_12T        11
#define        PwmClk_13T        12
#define        PwmClk_14T        13
#define        PwmClk_15T        14
#define        PwmClk_16T        15
#define        PwmClk_T2        16
#define        EAXSFR()                P_SW2 |=  0x80        /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作對象為擴展SFR(XSFR) */
#define        EAXRAM()                P_SW2 &= ~0x80        /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作對象為擴展RAM(XRAM) */
#define        PWM_Enable()        PWMCR |=  0x80        /* 使能PWM波形發生器,PWM計數器開始計數 */
#define        PWM_Disable()        PWMCR &= ~0x80        /* 關閉PWM波形發生器 */
#define P2n_standard(bitn)                        P2M1 &= ~(bitn),        P2M0 &= ~(bitn)
#define P2n_push_pull(bitn)                        P2M1 &= ~(bitn),        P2M0 |=  (bitn)
#define P2n_pure_input(bitn)                P2M1 |=  (bitn),        P2M0 &= ~(bitn)
#define P2n_open_drain(bitn)                P2M1 |=  (bitn),        P2M0 |=  (bitn)
#define                PWM_VECTOR                22
#define                PWM_DeadZone        24       /* 死區時鐘數, 6 ~ 24之間 24個時鐘是 1us */
typedef unsigned char         u8;
typedef unsigned int          u16;
typedef unsigned long         u32;

sbit LED_OUT =P3^3;
#define Port P1                         //設置CPU和模塊的通訊接口
u8        PWM_Index;        //SPWM查表索引
u8   dt4 ; // 4秒內或 10次過流啟動。
  u16 dtt;//開機標志



//sfr P2M0 = 0x96;         //P2口引腳模式寄存器
//sfr P1M0 = 0x92;         //P1口引腳模式寄存器
//sfr ADCCFG          = 0xDE;//   ADC 配置寄存器 DEH - - RESFMT - SPEED[3:0] xx0x,0000           RESFMT:ADC 轉換結果格式控制位,默認左對齊。
//sfr ADC_CONTR = 0xBC;//A/D 轉換控制寄存器 ADC_POWER ADC_START ADC_FLAG - ADC_CHS[3:0]  ADC_POWER,SPEED1,SPEED0,ADC_FLAG,ADC_START,CHS2,CHS1,CHS0;0000,0000
//sfr ADC_RES   = 0xBD;//A/D 轉換結果高8位  ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2;0000,0000
//sfr ADC_RESL  = 0xBE;//A/D 轉換結果低2位                                            ADCV.1 ADCV.0;0000,0000



//sfr ADC_CHS[3:0] = 0x07        ;         //第 x.7通道
#define ADC_POWER        0x80        //ADC電源控制位
#define ADC_FLAG        0x20        //ADC完成標志位
#define ADC_START        0x40        //ADC啟動控制位        #define ADC_START        0x08
#define ADC_SPEED0        0x02        //ADC轉換速度,一次轉換需要96個時鐘
#define ADC_SPEED1        0x05        //ADC轉換速度,一次轉換需要192個時鐘
#define ADC_SPEED2        0x0b        //ADC轉換速度,一次轉換需要364個時鐘
#define ADC_SPEED3        0x0f        //ADC轉換速度,一次轉換需要512個時鐘
#define N 8        //ADC采樣使用遞推平均濾波算法,采樣次數
/******************************
函數說明:初始化ADC寄存器,設置P1.7為ADC輸入功能
入口參數:無
出口參數:無
******************************/
void Init_ADC(void)
{   P1M0=0x00;
    P1M1=0x80;//  P1ASF = 0x80;                //打開P1.7口的ADC功能 (1000 0000 )
        ADC_RES = 0;        
        ADC_RESL= 0;                //清掉ADC轉換結果寄存器
    ADC_CONTR = ADC_POWER ;        //使能A/D供電,

        ADCCFG=        ADC_SPEED3;        //設置轉換速度90T  不設置速度, 采用PWM 計數器觸發采樣點。硬件自動觸發 A/D 轉換
   //sfr ADCCFG          = 0xDE;//   ADC 配置寄存器 DEH - - RESFMT - SPEED[3:0] xx0x,0000           RESFMT:ADC 轉換結果格式控制位,默認左對齊。
//sfr ADC_CONTR = 0xBC;//A/D 轉換控制寄存器 ADC_POWER ADC_START ADC_FLAG - ADC_CHS[3:0]  ADC_POWER,SPEED1,SPEED0,ADC_FLAG,ADC_START,CHS2,CHS1,CHS0;0000,0000


}

/******************************
函數說明:查詢方式讀取ADC轉換結果
入口參數:ch  ADC采樣通道
出口參數:int ADC_RES ADC轉換結果
******************************/
unsigned int Get_ADC_Result(unsigned char ch)
{
        unsigned int result;   //u16
        result =0 ;
        ADC_RES = 0;        
        ADC_RESL= 0;                                        //清掉ADC轉換結果寄存器
        ADCCFG=        ADC_SPEED3;
        ADC_CONTR =ADC_POWER|ADC_START|ch;//配置ADC,設置轉換通道,啟動轉換        /A/D 轉換控制寄存器 ADC_POWER ADC_START ADC_FLAG - ADC_CHS[3:0]
    _nop_();        _nop_();
    _nop_();        _nop_();                        //等待設置ADC_POWER完畢
    while (!(ADC_CONTR & ADC_FLAG));//讀取轉換完畢標志位ADC_FLAG
    ADC_CONTR &= ~ADC_FLAG;         //清除ADC_FLAG標志位
        result = ADC_RES<<4|ADC_RESL;        //讀取12位轉換結果保存到result
    return result;                  //返回ADC轉換結果12位
}
/******************************/

/******************************/
void Delay1000ms()                //@24.000MHz
{
        unsigned char data i, j, k;

        _nop_();
        _nop_();
        i = 92;
        j = 50;
        k = 238;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
//========================================================================
// 函數: void        PWM_config(void)
// 描述: PWM配置函數。
// 參數: none.
// 返回: none.
// 版本: VER1.0
// 日期:
// 備注:
//========================================================================
void        PWM_config(void)
{
  EAXSFR();                        // 訪問XFR
  PWM3T1 = 65; // 第一個翻轉計數
  PWM3T2=1220;         // 第二個翻轉計數
  PWM3CR =0;         // PWM3輸出選擇P2.3, 無中斷    pwm切換  有端口介紹(固定幾個口)
  PWM3CR  |=  0x80;        // 相應PWM通道的端口為PWM輸出口,受PWM波形發生器控制 ENC30
  PWM3CR &= ~0x40;        // 設置PWM輸出端口的初始電平為0 C3INI
  P23 = 0;
  P2n_push_pull(1<<3);        //IO初始化, 上電時為高阻
  PWM4T1= 65-PWM_DeadZone;                        // 第一個翻轉計數低字節
  PWM4T2 = (1220+PWM_DeadZone); // 第二個翻轉計數高字節
  PWM4CR = 0;        // PWM4輸出選擇P2.4, 無中斷
  PWM4CR  |=  0x80;        // 相應PWM通道的端口為PWM輸出口,受PWM波形發生器控制 ENC40
  //        PWMCFG &= ~0x04;        // 設置PWM輸出端口的初始電平為0  C4INI
  PWM4CR |=  0x40;        // 設置PWM輸出端口的初始電平為1
  P24 = 1;
  P2n_push_pull(1<<4);        //IO初始化, 上電時為高阻
  PWMC = 2400;        // PWM計數器的高字節           
     P26 = 0;                   //MOS管下臂
         P27 = 0;                   //MOS管下臂
  PWMCKS = PwmClk_1T;        // 時鐘源: PwmClk_1T,PwmClk_2T, ... PwmClk_16T, PwmClk_Timer2
   IP2H=PPWMFDH; //pwm異常檢測寄存器高位1, 為第3級。 ( 可以設置最高級4,加上 IP2=PPWMFD;) //設置PWM異常檢測優先級3
  EAXRAM();                        // 恢復訪問XRAM
////////////////////////////////
  PWMFDCR = ENFD  | FDIO; //PWM失效中斷控制,  FLTFLIO=1發生 WM 外部異常時,PWM 的輸出口立即被置為高阻模式??
            //FDIO==1 , 為P35,做為中斷異常檢測口;void PWMFD_Routine(void) interrupt 23;
  PWMCR |= ENPWM;                // 使能PWM波形發生器,PWM計數器開始計數
  //        PWMCR &= ~ECBI;                // 禁止PWM計數器歸零中斷
  PWMCR |=  ECBI;                // 允許PWM計數器歸零中斷


  PWMCFG=0x20 ; //ETADC  1:PWM 與 ADC 相關聯。允許在 PWM 周期中某個時間點觸發 A/D 轉換。使用 TADCPH 和 TADCPL進行設置。
        //           在 ETADC=1 且 ADC_POWER=1 時,{TADCPH,TADCPL}組成一個 15 位的寄存器。在 PWM 的計數周
//期中,當 PWM 的內部計數值與{TADCPH,TADCPL}的值相等時,硬件自動觸發 A/D 轉換
   TADCPL=0x80;
   TADCPH =0x01;                                  //2400 pwm總計數2400 ;    600點 1800就是2個上下最大計數值。 取600。
}
//**********************************************/
                                                                                                           

/**********************************************/

void main(void)
{   u16 hvv,haa ,j;         //高壓交流電壓, 交流電流;
     u16 mvv; //直流320V 母線電壓
         u8 g;
         dtt=0; //開機啟動標志0
       PWM_Index = 0;        
          ////////////////////////////////////////////////////////////////////////////////////////
                                
                                                        

     LED_OUT =1;   //單片機開機指示
//         P35=0;         //MOS管 S過流電阻 , 過流==1   P35異常檢測口
     P01=0;        //互感線圈過流         
     P02=0;           
     P03=0;          //不過流,溫度高
         P04=0;   //溫度高的,LED接口,指示用;
         P12=0;  //交流電壓反饋           2.5V ==230v 輸出有效值(最大值)ADC2 通道         ,這里用TL432的外部基準2.5v
         P17=0; //交流 電流反饋           2.5v ==8A  電流         (最大值)          adc7 通道
         P14=0; // 直流母線電壓反饋 端口電阻分壓到2.5V (最大值) =350V

             P1M0 &= ~0x94; P1M1 |= 0x94; //         //打開P17,P14 ,P12口的ADC功能(adc是高阻輸入模式)
             Init_ADC();
                   PWM_config();        //初始化PWM    50hZ
         EA = 1;                //允許全局中斷
                   PWM_Enable()   ;
            

  while (1)
  {                   hvv= Get_ADC_Result(2);        //將ADC P12電壓調整,輸出脈沖。讓電流 在合理范圍。
                haa= Get_ADC_Result(7);        //將ADC P17電壓調整,輸出脈沖。讓電流 在合理范圍。
            mvv= Get_ADC_Result(4);        //將ADC P14電壓調整,輸出脈沖。讓電流 在合理范圍。
                mvv=2.5*mvv/4069;  //外部基準為2.5v, 所以P14口,直流母線真是電壓值 (母線電壓有電阻分壓到2.5V,經過LM358運放 給P14.)   
                //這個真實值 到底mvv單位是V??? 還是mv ??????????????          如果直流母線電壓大于385V,也LED提示。
                if(mvv<2.25||mvv>2.75)          //2.4v還是2400mv實際測試決定一下。。。。。。
                { P02=1; } //P02接LED指示350v母線電壓偏低,或者沒有電壓,或者電壓大于385V 可以加入關閉PWM代碼。
                 else { P02=0; } ;
               
                      P0M0 &= ~0x08; P0M1 |= 0x08;          //        P03設置為 高阻輸入模式。開機記得接下拉電阻。

                 if( P03==1) //溫度高,停機或延時幾十秒,啟動。 由熱敏電阻,檢測后經LM358,送3v高電平到 p03口。
                   {     PWM_Disable() ; //關閉 PWM
                         PWM_Index=0;
                             P26=0;   P27=0;         //關閉2個 P26 P27方波口。
                                for(  g=1;g++;g<100)
                                {Delay1000ms();
                                P04= ~P04;    //LED指示閃,表示溫度高; 冷卻中;
                                
                                }  //冷卻100秒再開機;
                                
                                 PWM_config();
                                 dtt=0;       //開機標志   
                                 PWM_Enable()   ;
                   }
                  
                  
                  
                   if(dt4==1)                                 //異常處理完后,再開機 主要是過流異常。
                        {
                               //其他需要處理異常的語句,在此加入。
                         dtt=0;         //二次降壓開機模式 ,一樣標志為0
                         PWM_config();        //初始化PWM    50hZ                     
                         PWM_Enable()   ;
                        
                         }
                  

  }
}
/********************* PWM中斷函數************************/
void PWM_int (void) interrupt PWM_VECTOR
{        
  u16      j,  k;
  u8        SW2_tmp;
  if(PWMCFG & CBIF)        //PWM計數器歸零中斷標志 PWMCFG
  {
    PWMCFG &= ~CBIF;        //清除中斷標志
    SW2_tmp = P_SW2;        //保存SW2設置
    EAXSFR();                //訪問XFR
                                   ////////////////////////////////////////////////////////////////////////////////////////
                                if(dt4==1||dtt<200)//PWM異常處理 過流,完成后 。嘗試降壓啟動,數組用        ,開機啟動999也是從此開
                                {            dtt++; //開機標志999, dt4==1是過流,
                                        j=T_SinTable8[PWM_Index];        // 第一次,最低電壓啟動        8級        或沖擊電流大后,重新開機。
                                         dt4++;
                                }
                           if(dtt>=200&&dtt<400)                        //200點后,換波形                          // 第2個波形,低電壓 7        級
                           { j=T_SinTable7[PWM_Index];
                                  dtt++;
                                }
                                   if(dtt>=400&&dtt<600)                                                          // 第3個波形,低電壓啟動6        級
                           { j=T_SinTable6[PWM_Index];
                                   dtt++;
                                }
                                  if(dtt>=600&&dtt<800)                                                          // 第4,低電壓啟動5        級
                           { j=T_SinTable5[PWM_Index];
                                  dtt++        ;
                                }
                                   if(dtt>=800&&dtt<1000)                                                                             // 第5波,低電壓啟動4        級
                           { j=T_SinTable4[PWM_Index];
                                  dtt++        ;
                                }
                                 if(dtt>=1200&&dtt<1400)                                                  // 第6波,低電壓啟動3        級
                           { j=T_SinTable3[PWM_Index];
                                  dtt++        ;
                                }
                                 if(dtt>=1400&&dtt<1600)                                                          // 第7波,低電壓啟動2        級
                           { j=T_SinTable2[PWM_Index];
                                  dtt++;
                                }
                                                   if(dtt>=1800)                                                  // 第8波,低電壓啟動1        級
                           { j=T_SinTable[PWM_Index];
                                                                                   
                                 
                                }
                          ///////////////////////////////////////////////////////////////////////////
                          

        k = j ;

    PWM3T2H = (u8)(j >> 8);        //第二個翻轉計數高字節
    PWM3T2L  = (u8)j;              //第二個翻轉計數低字節
        
               
    j += PWM_DeadZone;                //死區

    // 指向PWM4
    PWM4T2H = (u8)(j >> 8);        //第二個翻轉計數高字節
    PWM4T2L = (u8)j;                        //第二個翻轉計數低字節
    P_SW2 = SW2_tmp;        //恢復SW2設置
                             
    if(++PWM_Index >= 200)   
             PWM_Index = 0;
  }                 
  ///////////////////////////
          if(PWM_Index<=99 )                   ///////////  每100個點  2個下管 輪流對應 40或45或 50hz方波  p2.6 p.27初值,  要與 上管, 的初值 相反。
{  P26=0;
           _nop_();
        _nop_();
   P27=1;
}
          if(PWM_Index>99 )
{        P26=1;
    _nop_();
        _nop_();
        P27=0;                                 
                }
                                                      
         }         
                 /********************* PWM異常中斷函數************************/
                 void PWMFD_Routine(void) interrupt 23
                {                     if(         PWMFDCR  &=FDIF)           //FDIF 中斷請求位
                         PWMFDCR  &=~FDIF  ;//清0 PWM異常檢測寄存器的  。                 
                            PWM_Disable() ; //關閉 PWM
                          P26=0;   P27=0;         //關閉2個 P26 P27方波口。

                              dtt=0;   //          再從0起。
                                PWM_Index=0;        // 正弦波表,再從0起。
                                dt4=1;        //異常計數 開始
                           
                            P41=1;
                                 Delay1000ms();        //異常后延時1秒。
                                 P41=0;                        //P41可以接LED燈。
                                                                                                     
                                }
        
                                    
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91在线看片| 99久久精品国产一区二区三区 | 成人在线中文字幕 | 精品国产黄a∨片高清在线 成人区精品一区二区婷婷 日本一区二区视频 | 中文字幕一二三 | 国产亚洲精品久久久久久豆腐 | 草草视频在线播放 | 久久久精品一区 | 爱爱免费视频网站 | 81精品国产乱码久久久久久 | 日日爱av| 欧美三区 | 久久中文视频 | 91久久久久久久久久久 | 日本亚洲欧美 | 日本超碰 | 久久在线 | av日韩高清 | 激情一区二区三区 | 午夜精品久久久久久久久久久久 | 性一爱一乱一交一视频 | 欧美日日 | 亚州综合一区 | 欧美美女爱爱视频 | 欧美在线综合 | 亚洲一二三区不卡 | 99精品一区二区三区 | 天天躁日日躁狠狠很躁 | 亚洲一区二区三区视频 | 91精品综合久久久久久五月天 | 亚洲精品免费观看 | 成人水多啪啪片 | 亚洲欧美日韩久久久 | 黄瓜av| www.99久久.com| 亚洲精品一区二区三区中文字幕 | 女同videos另类 | 91久久国产综合久久 | 国户精品久久久久久久久久久不卡 | 91精品国产一区二区在线观看 | 在线免费观看a级片 |