找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1736|回復(fù): 1
收起左側(cè)

STC8A8K64S4A12單片機(jī)編寫(xiě)的SPWM,帶軟啟動(dòng). 沒(méi)測(cè)試

[復(fù)制鏈接]
ID:675799 發(fā)表于 2023-9-5 17:30 | 顯示全部樓層 |閱讀模式
//一個(gè)SPWM帶有死區(qū)的程序 用STC8A8K64S4A12單片機(jī)編寫(xiě)的SPWM
//介紹了一種高性能微機(jī)控制的單相 SPWM 變頻調(diào)速系統(tǒng)  24000000L 增強(qiáng)型PWM
// SPWM信號(hào)經(jīng)低通濾波后可變換為正弦波,窄帶范圍內(nèi)的方波經(jīng)低通濾波后可變換為相應(yīng)頻率的正弦波
//主時(shí)鐘選擇24MHZ, PWM時(shí)鐘選擇1T, PWM周期2400, 死區(qū)24個(gè)時(shí)鐘(1us).正弦波表用200點(diǎn).
//輸出正弦波頻率 = 24000000/ 2400 / 200 = 50 HZ.                   PWMC = 2400;
//PWM4輸出選擇P2.2          // PWM3輸出選擇P2.3, 無(wú)中斷
//程序能用,如果不是你想要的頻率,那就 自己改一下數(shù)據(jù) 記得同時(shí)要替換數(shù)組里面的值
#define         MAIN_Fosc                24000000L        //定義主時(shí)鐘
#include        "STC8.H"
#include "intrins.h"           // _nop這個(gè)操作數(shù)用,ADC的。
unsigned int code T_SinTable[]={                                                   //50HZ         115幅值, 調(diào)制度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幅值, 調(diào)制度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幅值, 調(diào)制度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幅值, 調(diào)制度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幅值, 調(diào)制度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幅值, 調(diào)制度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幅值, 調(diào)制度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幅值, 調(diào)制度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幅值, 調(diào)制度10         //第一次啟動(dòng)用, 以后當(dāng)臨時(shí)數(shù)組。
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指令的操作對(duì)象為擴(kuò)展SFR(XSFR) */
#define        EAXRAM()                P_SW2 &= ~0x80        /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作對(duì)象為擴(kuò)展RAM(XRAM) */
#define        PWM_Enable()        PWMCR |=  0x80        /* 使能PWM波形發(fā)生器,PWM計(jì)數(shù)器開(kāi)始計(jì)數(shù) */
#define        PWM_Disable()        PWMCR &= ~0x80        /* 關(guān)閉PWM波形發(fā)生器 */
#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       /* 死區(qū)時(shí)鐘數(shù), 6 ~ 24之間 24個(gè)時(shí)鐘是 1us */
typedef unsigned char         u8;
typedef unsigned int          u16;
typedef unsigned long         u32;

sbit LED_OUT =P3^3;
#define Port P1                         //設(shè)置CPU和模塊的通訊接口
u8        PWM_Index;        //SPWM查表索引
u8   dt4 ; // 4秒內(nèi)或 10次過(guò)流啟動(dòng)。
  u16 dtt;//開(kāi)機(jī)標(biāo)志



//sfr P2M0 = 0x96;         //P2口引腳模式寄存器
//sfr P1M0 = 0x92;         //P1口引腳模式寄存器
//sfr ADCCFG          = 0xDE;//   ADC 配置寄存器 DEH - - RESFMT - SPEED[3:0] xx0x,0000           RESFMT:ADC 轉(zhuǎn)換結(jié)果格式控制位,默認(rèn)左對(duì)齊。
//sfr ADC_CONTR = 0xBC;//A/D 轉(zhuǎn)換控制寄存器 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 轉(zhuǎn)換結(jié)果高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 轉(zhuǎn)換結(jié)果低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完成標(biāo)志位
#define ADC_START        0x40        //ADC啟動(dòng)控制位        #define ADC_START        0x08
#define ADC_SPEED0        0x02        //ADC轉(zhuǎn)換速度,一次轉(zhuǎn)換需要96個(gè)時(shí)鐘
#define ADC_SPEED1        0x05        //ADC轉(zhuǎn)換速度,一次轉(zhuǎn)換需要192個(gè)時(shí)鐘
#define ADC_SPEED2        0x0b        //ADC轉(zhuǎn)換速度,一次轉(zhuǎn)換需要364個(gè)時(shí)鐘
#define ADC_SPEED3        0x0f        //ADC轉(zhuǎn)換速度,一次轉(zhuǎn)換需要512個(gè)時(shí)鐘
#define N 8        //ADC采樣使用遞推平均濾波算法,采樣次數(shù)
/******************************
函數(shù)說(shuō)明:初始化ADC寄存器,設(shè)置P1.7為ADC輸入功能
入口參數(shù):無(wú)
出口參數(shù):無(wú)
******************************/
void Init_ADC(void)
{   P1M0=0x00;
    P1M1=0x80;//  P1ASF = 0x80;                //打開(kāi)P1.7口的ADC功能 (1000 0000 )
        ADC_RES = 0;        
        ADC_RESL= 0;                //清掉ADC轉(zhuǎn)換結(jié)果寄存器
    ADC_CONTR = ADC_POWER ;        //使能A/D供電,

        ADCCFG=        ADC_SPEED3;        //設(shè)置轉(zhuǎn)換速度90T  不設(shè)置速度, 采用PWM 計(jì)數(shù)器觸發(fā)采樣點(diǎn)。硬件自動(dòng)觸發(fā) A/D 轉(zhuǎn)換
   //sfr ADCCFG          = 0xDE;//   ADC 配置寄存器 DEH - - RESFMT - SPEED[3:0] xx0x,0000           RESFMT:ADC 轉(zhuǎn)換結(jié)果格式控制位,默認(rèn)左對(duì)齊。
//sfr ADC_CONTR = 0xBC;//A/D 轉(zhuǎn)換控制寄存器 ADC_POWER ADC_START ADC_FLAG - ADC_CHS[3:0]  ADC_POWER,SPEED1,SPEED0,ADC_FLAG,ADC_START,CHS2,CHS1,CHS0;0000,0000


}

/******************************
函數(shù)說(shuō)明:查詢(xún)方式讀取ADC轉(zhuǎn)換結(jié)果
入口參數(shù):ch  ADC采樣通道
出口參數(shù):int ADC_RES ADC轉(zhuǎn)換結(jié)果
******************************/
unsigned int Get_ADC_Result(unsigned char ch)
{
        unsigned int result;   //u16
        result =0 ;
        ADC_RES = 0;        
        ADC_RESL= 0;                                        //清掉ADC轉(zhuǎn)換結(jié)果寄存器
        ADCCFG=        ADC_SPEED3;
        ADC_CONTR =ADC_POWER|ADC_START|ch;//配置ADC,設(shè)置轉(zhuǎn)換通道,啟動(dòng)轉(zhuǎn)換        /A/D 轉(zhuǎn)換控制寄存器 ADC_POWER ADC_START ADC_FLAG - ADC_CHS[3:0]
    _nop_();        _nop_();
    _nop_();        _nop_();                        //等待設(shè)置ADC_POWER完畢
    while (!(ADC_CONTR & ADC_FLAG));//讀取轉(zhuǎn)換完畢標(biāo)志位ADC_FLAG
    ADC_CONTR &= ~ADC_FLAG;         //清除ADC_FLAG標(biāo)志位
        result = ADC_RES<<4|ADC_RESL;        //讀取12位轉(zhuǎn)換結(jié)果保存到result
    return result;                  //返回ADC轉(zhuǎn)換結(jié)果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);
}
//========================================================================
// 函數(shù): void        PWM_config(void)
// 描述: PWM配置函數(shù)。
// 參數(shù): none.
// 返回: none.
// 版本: VER1.0
// 日期:
// 備注:
//========================================================================
void        PWM_config(void)
{
  EAXSFR();                        // 訪(fǎng)問(wèn)XFR
  PWM3T1 = 65; // 第一個(gè)翻轉(zhuǎn)計(jì)數(shù)
  PWM3T2=1220;         // 第二個(gè)翻轉(zhuǎn)計(jì)數(shù)
  PWM3CR =0;         // PWM3輸出選擇P2.3, 無(wú)中斷    pwm切換  有端口介紹(固定幾個(gè)口)
  PWM3CR  |=  0x80;        // 相應(yīng)PWM通道的端口為PWM輸出口,受PWM波形發(fā)生器控制 ENC30
  PWM3CR &= ~0x40;        // 設(shè)置PWM輸出端口的初始電平為0 C3INI
  P23 = 0;
  P2n_push_pull(1<<3);        //IO初始化, 上電時(shí)為高阻
  PWM4T1= 65-PWM_DeadZone;                        // 第一個(gè)翻轉(zhuǎn)計(jì)數(shù)低字節(jié)
  PWM4T2 = (1220+PWM_DeadZone); // 第二個(gè)翻轉(zhuǎn)計(jì)數(shù)高字節(jié)
  PWM4CR = 0;        // PWM4輸出選擇P2.2, 無(wú)中斷
  PWM4CR  |=  0x80;        // 相應(yīng)PWM通道的端口為PWM輸出口,受PWM波形發(fā)生器控制 ENC40
  //        PWMCFG &= ~0x04;        // 設(shè)置PWM輸出端口的初始電平為0  C4INI
  PWM4CR |=  0x40;        // 設(shè)置PWM輸出端口的初始電平為1
  P24 = 1;
  P2n_push_pull(1<<4);        //IO初始化, 上電時(shí)為高阻
  PWMC = 2400;        // PWM計(jì)數(shù)器的高字節(jié)           2550 為47HZ  2666為45HZ,   2400為50HZ
     P26 = 0;                   //MOS管下臂
         P27 = 0;                   //MOS管下臂
  PWMCKS = PwmClk_1T;        // 時(shí)鐘源: PwmClk_1T,PwmClk_2T, ... PwmClk_16T, PwmClk_Timer2
   IP2H=PPWMFDH; //pwm異常檢測(cè)寄存器高位1, 為第3級(jí)。 ( 可以設(shè)置最高級(jí)4,加上 IP2=PPWMFD;) //設(shè)置PWM異常檢測(cè)優(yōu)先級(jí)3
  EAXRAM();                        // 恢復(fù)訪(fǎng)問(wèn)XRAM
////////////////////////////////
  PWMFDCR = ENFD  | FDIO; //PWM失效中斷控制,  FLTFLIO=1發(fā)生 WM 外部異常時(shí),PWM 的輸出口立即被置為高阻模式??
            //FDIO==1 , 為P35,做為中斷異常檢測(cè)口;void PWMFD_Routine(void) interrupt 23;
  PWMCR |= ENPWM;                // 使能PWM波形發(fā)生器,PWM計(jì)數(shù)器開(kāi)始計(jì)數(shù)
  //        PWMCR &= ~ECBI;                // 禁止PWM計(jì)數(shù)器歸零中斷
  PWMCR |=  ECBI;                // 允許PWM計(jì)數(shù)器歸零中斷


  PWMCFG=0x20 ; //ETADC  1:PWM 與 ADC 相關(guān)聯(lián)。允許在 PWM 周期中某個(gè)時(shí)間點(diǎn)觸發(fā) A/D 轉(zhuǎn)換。使用 TADCPH 和 TADCPL進(jìn)行設(shè)置。
        //           在 ETADC=1 且 ADC_POWER=1 時(shí),{TADCPH,TADCPL}組成一個(gè) 15 位的寄存器。在 PWM 的計(jì)數(shù)周
//期中,當(dāng) PWM 的內(nèi)部計(jì)數(shù)值與{TADCPH,TADCPL}的值相等時(shí),硬件自動(dòng)觸發(fā) A/D 轉(zhuǎn)換
   TADCPL=0x80;
   TADCPH =0x01;                                  //2400 pwm總計(jì)數(shù)2400 ;    600點(diǎn) 1800就是2個(gè)上下最大計(jì)數(shù)值。 取600。
}
//**********************************************/
                                                                                                           

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

void main(void)
{   u16 hvv,haa ;         //高壓交流電壓, 交流電流;
     u16 mvv; //直流320V 母線(xiàn)電壓
         u8 g;
         dtt=0; //開(kāi)機(jī)啟動(dòng)標(biāo)志0

     PWM_Index = 0;                                                            

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

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

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

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

        k = j ;

    PWM3T2H = (u8)(j >> 8);        //第二個(gè)翻轉(zhuǎn)計(jì)數(shù)高字節(jié)
    PWM3T2L  = (u8)j;              //第二個(gè)翻轉(zhuǎn)計(jì)數(shù)低字節(jié)
        
               
    j += PWM_DeadZone;                //死區(qū)

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

                              dtt=0;   //          再?gòu)?起。
                                PWM_Index=0;        // 正弦波表,再?gòu)?起。
                                dt4=1;        //異常計(jì)數(shù) 開(kāi)始
                           
                            P41=1;
                                 Delay1000ms();        //異常后延時(shí)1秒。
                                 P41=0;                        //P41可以接LED燈。
                                                                                                     
                                }
回復(fù)

使用道具 舉報(bào)

ID:675799 發(fā)表于 2023-9-7 14:36 | 顯示全部樓層
//一個(gè)SPWM帶有死區(qū)的程序 用STC8A8K64S4A12單片機(jī)編寫(xiě)的SPWM
//介紹了一種高性能微機(jī)控制的單相 SPWM 變頻調(diào)速系統(tǒng)  24000000L 增強(qiáng)型PWM
// SPWM信號(hào)經(jīng)低通濾波后可變換為正弦波,窄帶范圍內(nèi)的方波經(jīng)低通濾波后可變換為相應(yīng)頻率的正弦波
//主時(shí)鐘選擇24MHZ, PWM時(shí)鐘選擇1T, PWM周期2400, 死區(qū)24個(gè)時(shí)鐘(1us).正弦波表用200點(diǎn).
//輸出正弦波頻率 = 24000000/ 2400 / 200 = 50 HZ.                   PWMC = 2400;
//PWM4輸出選擇P2.4         // PWM3輸出選擇P2.3, 無(wú)中斷
//程序能用,如果不是你想要的頻率,那就 自己改一下數(shù)據(jù) 記得同時(shí)要替換數(shù)組里面的值
#define         MAIN_Fosc                24000000L        //定義主時(shí)鐘
#include        "STC8.H"
#include "intrins.h"           // _nop這個(gè)操作數(shù)用,ADC的。
unsigned int code T_SinTable[]={                                                   //50HZ         115幅值, 調(diào)制度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幅值, 調(diào)制度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幅值, 調(diào)制度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幅值, 調(diào)制度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幅值, 調(diào)制度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幅值, 調(diào)制度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幅值, 調(diào)制度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幅值, 調(diào)制度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幅值, 調(diào)制度10         //第一次啟動(dòng)用, 以后當(dāng)臨時(shí)數(shù)組。
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指令的操作對(duì)象為擴(kuò)展SFR(XSFR) */
#define        EAXRAM()                P_SW2 &= ~0x80        /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作對(duì)象為擴(kuò)展RAM(XRAM) */
#define        PWM_Enable()        PWMCR |=  0x80        /* 使能PWM波形發(fā)生器,PWM計(jì)數(shù)器開(kāi)始計(jì)數(shù) */
#define        PWM_Disable()        PWMCR &= ~0x80        /* 關(guān)閉PWM波形發(fā)生器 */
#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       /* 死區(qū)時(shí)鐘數(shù), 6 ~ 24之間 24個(gè)時(shí)鐘是 1us */
typedef unsigned char         u8;
typedef unsigned int          u16;
typedef unsigned long         u32;

sbit LED_OUT =P3^3;
#define Port P1                         //設(shè)置CPU和模塊的通訊接口
u8        PWM_Index;        //SPWM查表索引
u8   dt4 ; // 4秒內(nèi)或 10次過(guò)流啟動(dòng)。
  u16 dtt;//開(kāi)機(jī)標(biāo)志



//sfr P2M0 = 0x96;         //P2口引腳模式寄存器
//sfr P1M0 = 0x92;         //P1口引腳模式寄存器
//sfr ADCCFG          = 0xDE;//   ADC 配置寄存器 DEH - - RESFMT - SPEED[3:0] xx0x,0000           RESFMT:ADC 轉(zhuǎn)換結(jié)果格式控制位,默認(rèn)左對(duì)齊。
//sfr ADC_CONTR = 0xBC;//A/D 轉(zhuǎn)換控制寄存器 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 轉(zhuǎn)換結(jié)果高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 轉(zhuǎn)換結(jié)果低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完成標(biāo)志位
#define ADC_START        0x40        //ADC啟動(dòng)控制位        #define ADC_START        0x08
#define ADC_SPEED0        0x02        //ADC轉(zhuǎn)換速度,一次轉(zhuǎn)換需要96個(gè)時(shí)鐘
#define ADC_SPEED1        0x05        //ADC轉(zhuǎn)換速度,一次轉(zhuǎn)換需要192個(gè)時(shí)鐘
#define ADC_SPEED2        0x0b        //ADC轉(zhuǎn)換速度,一次轉(zhuǎn)換需要364個(gè)時(shí)鐘
#define ADC_SPEED3        0x0f        //ADC轉(zhuǎn)換速度,一次轉(zhuǎn)換需要512個(gè)時(shí)鐘
#define N 8        //ADC采樣使用遞推平均濾波算法,采樣次數(shù)
/******************************
函數(shù)說(shuō)明:初始化ADC寄存器,設(shè)置P1.7為ADC輸入功能
入口參數(shù):無(wú)
出口參數(shù):無(wú)
******************************/
void Init_ADC(void)
{   P1M0=0x00;
    P1M1=0x80;//  P1ASF = 0x80;                //打開(kāi)P1.7口的ADC功能 (1000 0000 )
        ADC_RES = 0;        
        ADC_RESL= 0;                //清掉ADC轉(zhuǎn)換結(jié)果寄存器
    ADC_CONTR = ADC_POWER ;        //使能A/D供電,

        ADCCFG=        ADC_SPEED3;        //設(shè)置轉(zhuǎn)換速度90T  不設(shè)置速度, 采用PWM 計(jì)數(shù)器觸發(fā)采樣點(diǎn)。硬件自動(dòng)觸發(fā) A/D 轉(zhuǎn)換
   //sfr ADCCFG          = 0xDE;//   ADC 配置寄存器 DEH - - RESFMT - SPEED[3:0] xx0x,0000           RESFMT:ADC 轉(zhuǎn)換結(jié)果格式控制位,默認(rèn)左對(duì)齊。
//sfr ADC_CONTR = 0xBC;//A/D 轉(zhuǎn)換控制寄存器 ADC_POWER ADC_START ADC_FLAG - ADC_CHS[3:0]  ADC_POWER,SPEED1,SPEED0,ADC_FLAG,ADC_START,CHS2,CHS1,CHS0;0000,0000


}

/******************************
函數(shù)說(shuō)明:查詢(xún)方式讀取ADC轉(zhuǎn)換結(jié)果
入口參數(shù):ch  ADC采樣通道
出口參數(shù):int ADC_RES ADC轉(zhuǎn)換結(jié)果
******************************/
unsigned int Get_ADC_Result(unsigned char ch)
{
        unsigned int result;   //u16
        result =0 ;
        ADC_RES = 0;        
        ADC_RESL= 0;                                        //清掉ADC轉(zhuǎn)換結(jié)果寄存器
        ADCCFG=        ADC_SPEED3;
        ADC_CONTR =ADC_POWER|ADC_START|ch;//配置ADC,設(shè)置轉(zhuǎn)換通道,啟動(dòng)轉(zhuǎn)換        /A/D 轉(zhuǎn)換控制寄存器 ADC_POWER ADC_START ADC_FLAG - ADC_CHS[3:0]
    _nop_();        _nop_();
    _nop_();        _nop_();                        //等待設(shè)置ADC_POWER完畢
    while (!(ADC_CONTR & ADC_FLAG));//讀取轉(zhuǎn)換完畢標(biāo)志位ADC_FLAG
    ADC_CONTR &= ~ADC_FLAG;         //清除ADC_FLAG標(biāo)志位
        result = ADC_RES<<4|ADC_RESL;        //讀取12位轉(zhuǎn)換結(jié)果保存到result
    return result;                  //返回ADC轉(zhuǎn)換結(jié)果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);
}
//========================================================================
// 函數(shù): void        PWM_config(void)
// 描述: PWM配置函數(shù)。
// 參數(shù): none.
// 返回: none.
// 版本: VER1.0
// 日期:
// 備注:
//========================================================================
void        PWM_config(void)
{
  EAXSFR();                        // 訪(fǎng)問(wèn)XFR
  PWM3T1 = 65; // 第一個(gè)翻轉(zhuǎn)計(jì)數(shù)
  PWM3T2=1220;         // 第二個(gè)翻轉(zhuǎn)計(jì)數(shù)
  PWM3CR =0;         // PWM3輸出選擇P2.3, 無(wú)中斷    pwm切換  有端口介紹(固定幾個(gè)口)
  PWM3CR  |=  0x80;        // 相應(yīng)PWM通道的端口為PWM輸出口,受PWM波形發(fā)生器控制 ENC30
  PWM3CR &= ~0x40;        // 設(shè)置PWM輸出端口的初始電平為0 C3INI
  P23 = 0;
  P2n_push_pull(1<<3);        //IO初始化, 上電時(shí)為高阻
  PWM4T1= 65-PWM_DeadZone;                        // 第一個(gè)翻轉(zhuǎn)計(jì)數(shù)低字節(jié)
  PWM4T2 = (1220+PWM_DeadZone); // 第二個(gè)翻轉(zhuǎn)計(jì)數(shù)高字節(jié)
  PWM4CR = 0;        // PWM4輸出選擇P2.4, 無(wú)中斷
  PWM4CR  |=  0x80;        // 相應(yīng)PWM通道的端口為PWM輸出口,受PWM波形發(fā)生器控制 ENC40
  //        PWMCFG &= ~0x04;        // 設(shè)置PWM輸出端口的初始電平為0  C4INI
  PWM4CR |=  0x40;        // 設(shè)置PWM輸出端口的初始電平為1
  P24 = 1;
  P2n_push_pull(1<<4);        //IO初始化, 上電時(shí)為高阻
  PWMC = 2400;        // PWM計(jì)數(shù)器的高字節(jié)           
     P26 = 0;                   //MOS管下臂
         P27 = 0;                   //MOS管下臂
  PWMCKS = PwmClk_1T;        // 時(shí)鐘源: PwmClk_1T,PwmClk_2T, ... PwmClk_16T, PwmClk_Timer2
   IP2H=PPWMFDH; //pwm異常檢測(cè)寄存器高位1, 為第3級(jí)。 ( 可以設(shè)置最高級(jí)4,加上 IP2=PPWMFD;) //設(shè)置PWM異常檢測(cè)優(yōu)先級(jí)3
  EAXRAM();                        // 恢復(fù)訪(fǎng)問(wèn)XRAM
////////////////////////////////
  PWMFDCR = ENFD  | FDIO; //PWM失效中斷控制,  FLTFLIO=1發(fā)生 WM 外部異常時(shí),PWM 的輸出口立即被置為高阻模式??
            //FDIO==1 , 為P35,做為中斷異常檢測(cè)口;void PWMFD_Routine(void) interrupt 23;
  PWMCR |= ENPWM;                // 使能PWM波形發(fā)生器,PWM計(jì)數(shù)器開(kāi)始計(jì)數(shù)
  //        PWMCR &= ~ECBI;                // 禁止PWM計(jì)數(shù)器歸零中斷
  PWMCR |=  ECBI;                // 允許PWM計(jì)數(shù)器歸零中斷


  PWMCFG=0x20 ; //ETADC  1:PWM 與 ADC 相關(guān)聯(lián)。允許在 PWM 周期中某個(gè)時(shí)間點(diǎn)觸發(fā) A/D 轉(zhuǎn)換。使用 TADCPH 和 TADCPL進(jìn)行設(shè)置。
        //           在 ETADC=1 且 ADC_POWER=1 時(shí),{TADCPH,TADCPL}組成一個(gè) 15 位的寄存器。在 PWM 的計(jì)數(shù)周
//期中,當(dāng) PWM 的內(nèi)部計(jì)數(shù)值與{TADCPH,TADCPL}的值相等時(shí),硬件自動(dòng)觸發(fā) A/D 轉(zhuǎn)換
   TADCPL=0x80;
   TADCPH =0x01;                                  //2400 pwm總計(jì)數(shù)2400 ;    600點(diǎn) 1800就是2個(gè)上下最大計(jì)數(shù)值。 取600。
}
//**********************************************/
                                                                                                           

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

void main(void)
{   u16 hvv,haa ,j;         //高壓交流電壓, 交流電流;
     u16 mvv; //直流320V 母線(xiàn)電壓
         u8 g;
         dtt=0; //開(kāi)機(jī)啟動(dòng)標(biāo)志0
       PWM_Index = 0;        
          ////////////////////////////////////////////////////////////////////////////////////////
                                
                                                        

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

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

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

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

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

        k = j ;

    PWM3T2H = (u8)(j >> 8);        //第二個(gè)翻轉(zhuǎn)計(jì)數(shù)高字節(jié)
    PWM3T2L  = (u8)j;              //第二個(gè)翻轉(zhuǎn)計(jì)數(shù)低字節(jié)
        
               
    j += PWM_DeadZone;                //死區(qū)

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

                              dtt=0;   //          再?gòu)?起。
                                PWM_Index=0;        // 正弦波表,再?gòu)?起。
                                dt4=1;        //異常計(jì)數(shù) 開(kāi)始
                           
                            P41=1;
                                 Delay1000ms();        //異常后延時(shí)1秒。
                                 P41=0;                        //P41可以接LED燈。
                                                                                                     
                                }
        
                                    
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表