找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

STC8单片机做逆变50hz,这里的例子程序,要怎么改?

查看数: 3025 | 评论数: 22 | 收藏 3
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-11-24 15:58

正文摘要:

一个SPWM带有死区的程序 用STC8A8K64S4A12单片机编写的SPWM //一个SPWM带有死区的程序 用STC8A8K64S4A12单片机编写的SPWM //介绍了一种高性能微机控制的单相 SPWM 变频调速系统 // SPWM信号经低通滤波后可变换为正弦 ...

回复

ID:844772 发表于 2021-12-28 09:09
你仔细研究T_SinTable[]就发现,它有两个1220,按你4个0的说法,T_SinTable[]第一个1220是上个波末和这个波初的两个零,中间一个1220时同一个波上半周和下半周的两个零。
你务必用示波器看一下,特别是看一下死区对不对,再加负载啊,觉得程序还不很成熟。
另外驱动电饭锅也就算了,卷帘门是感性电路啊
ID:675799 发表于 2021-12-28 08:57
本帖最后由 hww22 于 2021-12-28 09:27 编辑

********************* PWM中断函数************************/
void PWM_int (void) interrupt PWM_VECTOR
{
  u16        j;
  u8        SW2_tmp;
  if(PWMCFG & CBIF)        //PWM计数器归零中断标志 PWMCFG
  {
    PWMCFG &= ~CBIF;        //清除中断标志
    SW2_tmp = P_SW2;        //保存SW2设置
    EAXSFR();                //访问XFR
    j = T_SinTable[PWM_Index];
    if (过流)             ////////////     过流 降压   
j=j*0.6              // 降压为 原来0.6                              //////////////////////////
    PWM3T2H = (u8)(j >> 8);        //第二个翻转计数高字节
    PWM3T2L  = (u8)j;                        //第二个翻转计数低字节
    j += PWM_DeadZone;                //死区if(j==1220)                    ///////////    2个下管 轮流50HZ方波  p2.6 p.27初值,  要与 上管, 的初值 相反。
{  P 2.6=~P 2.6;
   P2.7=~P2.7;
}
    // 指向PWM4   PWM4T2H = (u8)(j >> 8);        //第二个翻转计数高字节
    PWM4T2L = (u8)j;                        //第二个翻转计数低字节
    P_SW2 = SW2_tmp;        //恢复SW2设置
    if(++PWM_Index >= 200)   
    PWM_Index = 0;
  
  }
}


ID:675799 发表于 2021-12-28 08:34
本帖最后由 hww22 于 2021-12-28 08:57 编辑
glinfei 发表于 2021-12-27 17:49
你过流时,应该不动T1,只改T2就行啊,根据过流情况给 T_SinTable乘以一个百分比整体降压;你是在做H桥逆变 ...

直流310V , H 桥 的。       自己做来玩玩, 驱动 卷帘门,之类。 停电神器。
T_SinTable 乘以一个百分比整体降压, 放在中断函数 里面,是吧。
这么说 我把2个 下管 轮流送 方波信号, 就可以了。  
if (j==1220)   //0值, 就切换方波 比如 P1.6    P1.7
{P1.6 =0;
P1.7 =1; }
if (j==???)   //0值, 就切换方波 比如 P1.6    P1.7
{P1.6 =1;
P1.7 =0; }


问题是  1个周期有 4个 0值吧。  其余3个 呢?
ID:844772 发表于 2021-12-27 17:49
本帖最后由 glinfei 于 2021-12-27 18:09 编辑

你过流时,应该不动T1,只改T2就行啊,根据过流情况给 T_SinTable[PWM_Index]乘以一个百分比整体降压;你是在做H桥逆变吧?带了死区,没啥特别建议,分别看看波形再上负载;
你是在直流上做正弦波,零在T_SinTable[]=1220,实在不行你就利用PWM控制你说的上下管导通(带了死区);利用PWM_Index控制左右管导通?
另外,调整T_SinTable[],很容易做出你图一的波形。
ID:675799 发表于 2021-12-27 15:37
glinfei 发表于 2021-11-30 09:08
对啊,我说的就是这个意思。

为了降低 脉冲突变, 所以现在是 2个上管,轮流送 正弦波脉冲, 2个下管轮流送同级性的电平信号。
都是在 读取的 0值, (最小值0)。 进行 下管切换换的。

程序要怎么写才合理。
ID:675799 发表于 2021-12-27 15:27
SURUBU1976 发表于 2021-12-7 19:27
写程序要与硬件配合的,都没有实质的科目怎么讨论?

实际上,电路 很多是1边输入 正弦波脉冲, 1边输入 同极性的 电平信号。
ID:507641 发表于 2021-12-7 19:27
写程序要与硬件配合的,都没有实质的科目怎么讨论?
ID:675799 发表于 2021-12-6 10:46
while (1)
  {
    for(i=1;i!=0;i<<=1)  // 0000 0000
    {///////////
if (过流)
          { PWM3T1 = 65; // 第一个翻转计数 改 35  ??
  PWM3T2=1220;         // 第二个翻转计数 改 610  ???
PWM4T1= 65-PWM_DeadZone;                        // 第一个翻转计数低字节  降级脉冲 65改35??
  PWM4T2 = (1220+PWM_DeadZone); // 第二个翻转计数高字节 1220改610 ??

}
if(轻负荷)
{ PWM3T1 = 65; // 第一个翻转计数 改 30  ??
  PWM3T2=1220;         // 第二个翻转计数 改 405  ???
PWM4T1= 65-PWM_DeadZone;                        // 第一个翻转计数低字节  降级脉冲 65改30??
  PWM4T2 = (1220+PWM_DeadZone); // 第二个翻转计数高字节 1220改610 ??

}//////////////
if(不过流)
   { PWM3T1 = 65; // 第一个翻转计数 改 35  ??
  PWM3T2=1220;         // 第二个翻转计数 改 610  ???
PWM4T1= 65-PWM_DeadZone;                        // 第一个翻转计数低字节  降级脉冲 65改35??
  PWM4T2 = (1220+PWM_DeadZone); // 第二个翻转计数高字节 1220改610 ??

}//////////////
ID:675799 发表于 2021-12-3 11:36
glinfei 发表于 2021-12-1 08:56
不过是调整PWM2_2的T1T2,减小占空比而已,要注意是动态调,不过流就增大占空比,使得一直处于快要过流状 ...

oid main(void)
{
  unsigned char i;
  OE245 =0;
  LED_OUT =1;
  PWM_config();        //初始化PWM
  EA = 1;                //允许全局中断
  while (1)
  {
    for(i=1;i!=0;i<<=1)  // 0000 0000
    {///////////
if (过流)
          { PWM3T1 = 65; // 第一个翻转计数 改 35  ??
  PWM3T2=1220;         // 第二个翻转计数 改 610  ???
PWM4T1= 65-PWM_DeadZone;                        // 第一个翻转计数低字节  降级脉冲 65改35??
  PWM4T2 = (1220+PWM_DeadZone); // 第二个翻转计数高字节 1220改610 ??

}
if(不过流)
   { PWM3T1 = 65; // 第一个翻转计数 改 35  ??
  PWM3T2=1220;         // 第二个翻转计数 改 610  ???
PWM4T1= 65-PWM_DeadZone;                        // 第一个翻转计数低字节  降级脉冲 65改35??
  PWM4T2 = (1220+PWM_DeadZone); // 第二个翻转计数高字节 1220改610 ??

}//////////////
      Port =~i; //0111 1111
      delay(200000);
    }
  }
}
ID:844772 发表于 2021-12-1 08:56
hww22 发表于 2021-11-30 15:04
如果要检测,输出的4个管子,过流,然后,降低脉宽(功率),要怎么写代码? P1.2端口,低电平表示过流。  ...

不过是调整PWM2_2的T1T2,减小占空比而已,要注意是动态调,不过流就增大占空比,使得一直处于快要过流状态。
ID:675799 发表于 2021-11-30 15:04
glinfei 发表于 2021-11-30 09:08
对啊,我说的就是这个意思。

如果要检测,输出的4个管子,过流,然后,降低脉宽(功率),要怎么写代码? P1.2端口,低电平表示过流。 因为浴霸启动电流大,所以要低功率,启动1下。
ID:844772 发表于 2021-11-30 09:08
hww22 发表于 2021-11-30 08:46
24000000L /200点 /2400计数器=50HZ,

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

对啊,我说的就是这个意思。
ID:675799 发表于 2021-11-30 08:46
24000000L /200点 /2400计数器=50HZ,

如果 要输出 45,   240000000/200 /2666=45hz   
PWMC = 2666;        // PWM计数器的高字节 ,  2666为45HZ
  PWMCKS = PwmClk_1T;        // 时钟源: PwmClk_1T,PwmClk_2T, ... PwmClk_16T, PwmClk_Timer2
ID:844772 发表于 2021-11-29 17:39
1.这里是用积分表示SIN函数,你可以理解把一个周期切成200片,通过占空比不同,用矩形波代替每片的函数,然后再通过低通就是正弦波了。
2.用200个PWM(不同占空比的波)表示一个正弦波。
3.所以就很明显了,你sin函数的频率就是PWM频率除以200,要调整频率就几种了,一种是调整PWM,一种是改变函数取样数量(目前是200),还有就是用几个PWM处理一片(这样会更平滑)。
不知道我说明白没,好多人不懂其实是数学问题。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

ID:675799 发表于 2021-11-29 10:04
wc86110 发表于 2021-11-27 05:34
弱弱的问一句,上面的 《……T_SinTable[]={……》怎么来的?

定义1个 正弦波sin数组, 数值,是他们用软件生成,终值1220
ID:96682 发表于 2021-11-27 05:34
弱弱的问一句,上面的 《……T_SinTable[]={……》怎么来的?
ID:675799 发表于 2021-11-25 16:34
继续问,直到有人会, 估计也没几个会。  会皮毛的,估计也不多。
ID:123289 发表于 2021-11-25 16:06
1、你想达成什么目的?假设是A。
2、你给出的例子,达成了什么目的?假设是B。
3、A与B有什么关联,你想利用B的哪些东东,来达成A。
4、从B到A,哪几项不会,需要帮助?
拧得清?


ID:624769 发表于 2021-11-25 14:49
回复 +1
要回复容易,这就给你回复了。
问题是,别人如何我不知道,我是因为你的题目看不懂,所以,帮不了你…… 只好一直不回复……
ID:675799 发表于 2021-11-25 14:03
估计这个 挂这个1年,总有回复1下答案吧。
ID:675799 发表于 2021-11-24 16:05
这个 并没有直接指定 频率, 那要 50HZ, 或则45HZ, 要怎么修改。

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表