完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
各位老师好,这个BLDC3-1例程中,PWM模块这占空比是怎么算的呢?求指导
void F281X_EV1_BDC_PWM_Update(PWMGEN *p) [ int32 Tmp; int16 Period, GPR0_BDC_PWM; // PWM1&4 are enabled (PWM4's forced ON) and PWM2&3 are disabled if (p->Rotation==0) EvaRegs.ACTRA.all = 0x00C2; // PWM2&3 are enabled (PWM2's forced ON) and PWM1&4 are disabled else if (p->Rotation==1) EvaRegs.ACTRA.all = 0x002C; // Otherwise, PWM1-4 are disabled else EvaRegs.ACTRA.all = 0x0000; // Convert "Period" (Q15) modulation function to Q0 Tmp = (int32)p->PeriodMax*(int32)p->MfuncPeriod; // Q15 = Q0*Q15 Period = (int16)(Tmp>>15); // Q15 -> Q0 (period) // Check pwm_active setting if (p->PwmActive==1) // PWM active high GPR0_BDC_PWM = 0x7FFF - p->DutyFunc; else if (p->PwmActive==0) // PWM active low GPR0_BDC_PWM = p->DutyFunc; // Convert "DutyFunc" or "GPR0_BDC_PWM" (Q15) duty modulation function to Q0 Tmp = (int32)Period*(int32)GPR0_BDC_PWM; // Q15 = Q0*Q15 EvaRegs.CMPR1 = (int16)(Tmp>>15); // Q15 -> Q0 EvaRegs.CMPR2 = (int16)(Tmp>>15); // Q15 -> Q0 ] 为什么总是对Tmp进行右移呢?这个0x7FFF是干啥的?速度计算那块就有0x7FFF,解释是周期寄存器的值,但是也找不到哪个周期寄存器的值是0x7FFF. 麻烦老师指导一下。谢谢 |
|
相关推荐
7 个讨论
|
|
“ 为什么总是对Tmp进行右移呢?这个0x7FFF是干啥的?速度计算那块就有0x7FFF,解释是周期寄存器的值,但是也找不到哪个周期寄存器的值是0x7FFF. “ Eric: 首先你要理解一下Q格式的概念,就是把小数左移多少位变成整数去参与过程运算,因为C28x内核是定点内核,做浮点运算很慢,所以要转换成定点去参与过程运算,到最终再转换回来。 举例, 0.5 的 Q15格式就是0.5 乘以2的15次方,就是左移15位。 所以 Tmp = (int32)p->PeriodMax*(int32)p->MfuncPeriod; // Q15 = Q0*Q15 Period = (int16)(Tmp>>15); // Q15 -> Q0 (period) 上面中的Tmp就是周期值去乘以一个Q15的占空比,计算完之后,再右移回来,变成实际的周期值。 至于0x7FFF, 你可以自己计算一下嘛,如果要产生多少KHz的PWM,可以算法计数值是多少。 - ERIC |
|
|
|
|
|
guigui_7044 发表于 2018-9-7 11:44 老师,您好,谢谢您的解答。 实在抱歉,还是没搞明白0x7FFF是怎么来的,pwm1.PeriodMax = (SYSTEM_FREQUENCY/PWM_FREQUENCY)*1000;得出PeriodMax是7500。 根据以下这段程序,TIPR也是7500, if (p->PwmActive==1) // PWM active high GPR0_BLDC_PWM = 0x7FFF - p->DutyFunc; 那为什么在这两行程序中会用 0x7FFF减去占空比,而不是用7500去减呢?麻烦老师指点,谢谢老师! void F281X_EV1_BLDC_PWM_Init(PWMGEN *p) [ EvaRegs.T1PR = p->PeriodMax; // Init Timer 1 Period Register EvaRegs.T1CON.all = BLDCPWM_INIT_STATE; // Init PWM Operation EvaRegs.ACTRA.all = 0x0000; EvaRegs.GPTCONA.all = 0x0000; EvaRegs.COMCONA.all = 0xA200; EALLOW; // Enable EALLOW GpioMuxRegs.GPAMUX.all |= 0x003F; // Setting PWM1-6 as primary output pins EDIS; // Disable EALLOW ] void F281X_EV1_BLDC_PWM_Update(PWMGEN *p) [ int32 Tmp; int16 Period, GPR0_BLDC_PWM; // State s1: current flows to motor windings from phase A->B, de-energized phase = C if (p->CmtnPointer==0) EvaRegs.ACTRA.all = 0x00C2; // State s2: current flows to motor windings from phase A->C, de-energized phase = B else if (p->CmtnPointer==1) EvaRegs.ACTRA.all = 0x0C02; // State s3: current flows to motor windings from phase B->C, de-energized phase = A else if (p->CmtnPointer==2) EvaRegs.ACTRA.all = 0x0C20; // State s4: current flows to motor windings from phase B->A, de-energized phase = C else if (p->CmtnPointer==3) EvaRegs.ACTRA.all = 0x002C; // State s5: current flows to motor windings from phase C->A, de-energized phase = B else if (p->CmtnPointer==4) EvaRegs.ACTRA.all = 0x020C; // State s6: current flows to motor windings from phase C->B, de-energized phase = A else if (p->CmtnPointer==5) EvaRegs.ACTRA.all = 0x02C0; // Convert "Period" (Q15) modulation function to Q0 Tmp = (int32)p->PeriodMax*(int32)p->MfuncPeriod; // Q15 = Q0*Q15 Period = (int16)(Tmp>>15); // Q15 -> Q0 (Period) // Check PwmActive setting if (p->PwmActive==1) // PWM active high GPR0_BLDC_PWM = 0x7FFF - p->DutyFunc; else if (p->PwmActive==0) // PWM active low GPR0_BLDC_PWM = p->DutyFunc; // Convert "DutyFunc" or "GPR0_BLDC_PWM" (Q15) duty modulation function to Q0 Tmp = (int32)Period*(int32)GPR0_BLDC_PWM; // Q15 = Q0*Q15 EvaRegs.CMPR1 = (int16)(Tmp>>15); // Q15 -> Q0 EvaRegs.CMPR2 = (int16)(Tmp>>15); // Q15 -> Q0 EvaRegs.CMPR3 = (int16)(Tmp>>15); // Q15 -> Q0 ] |
|
|
|
|
|
60user158 发表于 2018-9-7 11:54 ” // Convert "Period" (Q15) modulation function to Q0 Tmp = (int32)p->PeriodMax*(int32)p->MfuncPeriod; // Q15 = Q0*Q15 Period = (int16)(Tmp>>15); // Q15 -> Q0 (Period) // Check PwmActive setting if (p->PwmActive==1) // PWM active high GPR0_BLDC_PWM = 0x7FFF - p->DutyFunc; else if (p->PwmActive==0) // PWM active low GPR0_BLDC_PWM = p->DutyFunc; // Convert "DutyFunc" or "GPR0_BLDC_PWM" (Q15) duty modulation function to Q0 Tmp = (int32)Period*(int32)GPR0_BLDC_PWM; // Q15 = Q0*Q15 EvaRegs.CMPR1 = (int16)(Tmp>>15); // Q15 -> Q0 EvaRegs.CMPR2 = (int16)(Tmp>>15); // Q15 -> Q0 EvaRegs.CMPR3 = (int16)(Tmp>>15); // Q15 -> Q0 “ Eric: 周期值确实是Period 这个变量,由Periodmax乘以一个调制比。也就是7500. 而0x7FFF是一个Q15格式的1, 即1左移15位。 如注释,当PWM为active high的时候,占空比= 1 - D, 都为Q15格式。 当PWM为aictive low 的时候,则占空比= D, 也是Q15格式。 - ERIC |
|
|
|
|
|
guigui_7044 发表于 2018-9-7 12:12 老师,麻烦您能解释一下BLDC3-1例程中速度计算模块,SpeedScaler = 60/(T*Kp*n*BaseRPM),而程序中给的是SpeedScaler = ISR_FREQ/BaseRPM,这个转换过程是怎样完成的? 麻烦老师了。谢谢您! |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
325 浏览 1 评论
523 浏览 2 评论
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
763 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
644 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1119 浏览 1 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
17浏览 28评论
45浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
241浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
192浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
52浏览 13评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 09:43 , Processed in 0.937503 second(s), Total 69, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号