一个SPWM带有死区的程序 用STC8A8K64S4A12单片机编写的SPWM
- //一个SPWM带有死区的程序 用STC8A8K64S4A12单片机编写的SPWM
- //介绍了一种高性能微机控制的单相 SPWM 变频调速系统
- // SPWM信号经低通滤波后可变换为正弦波,窄带范围内的方波经低通滤波后可变换为相应频率的正弦波
- //程序能用,如果不是你想要的频率,那就 自己改一下数据 记得同时要替换数组里面的值
- #define MAIN_Fosc 24000000L //定义主时钟
- #include "STC8.H"
- unsigned int code T_SinTable[]={
- 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,
- };
- #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 12 /* 死区时钟数, 6 ~ 24之间 */
- typedef unsigned char u8;
- typedef unsigned int u16;
- typedef unsigned long u32;
- sbit OE245 =P4^1;
- sbit LED_OUT =P3^3;
- #define Port P1 //设置CPU和模块的通讯接口
- u8 PWM_Index; //SPWM查表索引
- void delay(unsigned long d)
- {
- while(d--);
- }
- //========================================================================
- // 函数: void PWM_config(void)
- // 描述: PWM配置函数。
- // 参数: none.
- // 返回: none.
- // 版本: VER1.0
- // 日期:
- // 备注:
- //========================================================================
- void PWM_config(void)
- {
- EAXSFR(); // 访问XFR
- PWM3T1 = 65; // 第一个翻转计数
- PWM3T2=1220; // 第二个翻转计数
- PWM3CR =0; // PWM3输出选择P2.3, 无中断
- 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计数器的高字节
- PWMCKS = PwmClk_1T; // 时钟源: PwmClk_1T,PwmClk_2T, ... PwmClk_16T, PwmClk_Timer2
- EAXRAM(); // 恢复访问XRAM
-
- PWMCR |= ENPWM; // 使能PWM波形发生器,PWM计数器开始计数
- // PWMCR &= ~ECBI; // 禁止PWM计数器归零中断
- PWMCR |= ECBI; // 允许PWM计数器归零中断
- // PWMFDCR = ENFD | FLTFLIO | FDIO; //PWM失效中断控制, ENFD | FLTFLIO | EFDI | FDCMP | FDIO
- }
- /**********************************************/
- void main(void)
- {
- unsigned char i;
- OE245 =0;
- LED_OUT =1;
- PWM_config(); //初始化PWM
- EA = 1; //允许全局中断
- while (1)
- {
- for(i=1;i!=0;i<<=1) // 0000 0000
- {
- Port =~i; //0111 1111
- delay(200000);
- }
- }
- }
- /********************* PWM中断函数************************/
- void PWM_int (void) interrupt PWM_VECTOR
- {
- u16 j;
- u8 SW2_tmp;
- if(PWMCFG & CBIF) //PWM计数器归零中断标志 PWMCFG
- {
- PWMCFG &= ~CBIF; //清除中断标志
- SW2_tmp = P_SW2; //保存SW2设置
- EAXSFR(); //访问XFR
- j = T_SinTable[PWM_Index];
- 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;
- }
- }
复制代码
单片机SPWM波 产生正弦波的源程序及工具
http://www.51hei.com/bbs/dpj-55510-1.html
|