你仔细研究T_SinTable[]就发现,它有两个1220,按你4个0的说法,T_SinTable[]第一个1220是上个波末和这个波初的两个零,中间一个1220时同一个波上半周和下半周的两个零。 你务必用示波器看一下,特别是看一下死区对不对,再加负载啊,觉得程序还不很成熟。 另外驱动电饭锅也就算了,卷帘门是感性电路啊 |
本帖最后由 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; } } |
本帖最后由 hww22 于 2021-12-28 08:57 编辑 glinfei 发表于 2021-12-27 17:49 直流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个 呢? |
本帖最后由 glinfei 于 2021-12-27 18:09 编辑 你过流时,应该不动T1,只改T2就行啊,根据过流情况给 T_SinTable[PWM_Index]乘以一个百分比整体降压;你是在做H桥逆变吧?带了死区,没啥特别建议,分别看看波形再上负载; 你是在直流上做正弦波,零在T_SinTable[]=1220,实在不行你就利用PWM控制你说的上下管导通(带了死区);利用PWM_Index控制左右管导通? 另外,调整T_SinTable[],很容易做出你图一的波形。 |
glinfei 发表于 2021-11-30 09:08 为了降低 脉冲突变, 所以现在是 2个上管,轮流送 正弦波脉冲, 2个下管轮流送同级性的电平信号。 都是在 读取的 0值, (最小值0)。 进行 下管切换换的。 程序要怎么写才合理。 |
SURUBU1976 发表于 2021-12-7 19:27 实际上,电路 很多是1边输入 正弦波脉冲, 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; // 第一个翻转计数 改 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 ?? }////////////// |
glinfei 发表于 2021-12-1 08:56 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); } } } |
hww22 发表于 2021-11-30 15:04 不过是调整PWM2_2的T1T2,减小占空比而已,要注意是动态调,不过流就增大占空比,使得一直处于快要过流状态。 |
glinfei 发表于 2021-11-30 09:08 如果要检测,输出的4个管子,过流,然后,降低脉宽(功率),要怎么写代码? P1.2端口,低电平表示过流。 因为浴霸启动电流大,所以要低功率,启动1下。 |
hww22 发表于 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 |
wc86110 发表于 2021-11-27 05:34 定义1个 正弦波sin数组, 数值,是他们用软件生成,终值1220 |
弱弱的问一句,上面的 《……T_SinTable[]={……》怎么来的? |
继续问,直到有人会, 估计也没几个会。 会皮毛的,估计也不多。 |
1、你想达成什么目的?假设是A。 2、你给出的例子,达成了什么目的?假设是B。 3、A与B有什么关联,你想利用B的哪些东东,来达成A。 4、从B到A,哪几项不会,需要帮助? 拧得清? |
回复 +1 要回复容易,这就给你回复了。 问题是,别人如何我不知道,我是因为你的题目看不懂,所以,帮不了你…… 只好一直不回复…… |
估计这个 挂这个1年,总有回复1下答案吧。 |
这个 并没有直接指定 频率, 那要 50HZ, 或则45HZ, 要怎么修改。 |