标题:
问大神:STC8A8K64S4A12芯片怎么单独使用里面PWM部分产生正弦波信号
[打印本页]
作者:
zz2200
时间:
2019-8-9 13:52
标题:
问大神:STC8A8K64S4A12芯片怎么单独使用里面PWM部分产生正弦波信号
同标题
作者:
angmall
时间:
2019-8-12 14:23
一个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
作者:
cjm82
时间:
2019-8-12 22:50
如果要求不高,用50%占空比输出方波,经过一个截止频率等于方波频率的4阶以上低通滤波器,出来的基本就是个正弦波了.
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1