查看: 3050|回复: 0

[S12] 【我要创作】基于S12ZVM的BLDC(6)——软件实现(3)

[复制链接]
  • TA的每日心情
    郁闷
    2021-3-10 19:44
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    126

    主题

    525

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2018
    最后登录
    2023-12-25
    发表于 2017-3-8 22:43:57 | 显示全部楼层 |阅读模式
    1.png
                                     图1
    2.png
                                    图2
    1. INTERRUPT void PTUTrigger1Done_ISR(void)
    2. {
    3. timeOldBEMF = timeBEMF;
    4. timeBEMF = TIM0TCNT;
    5. PTUIFL = PTUIFL_TG1DIF_MASK;// Clear flag
    6. }
    复制代码
    在PTU触发器列表中的所有触发器均已完成调度时, PTU触发完成中断服务程序(ISR)将被激活。PTU、 PTU触发器列表和ADC命令列表配置为在BEMF测量发生时如图1,即执行PTU触发完成中断服务程序。在ISR中,上一个周期内获取的BEMF测量时间和自由运行定时器的计数器值将会存储下来,如图2所示。要计算过零点,必须同时使用两个时间戳。
    状态变量采集和过零点检测处理
    在状态变量采集和过零点检测处理中将使用ADC0完成中断。在ADC0和ADC1达到ADC命令列表末尾处时,将会执行中断服务程序(ISR); ADC1和ADC0命令列表中的最后一条命令分别是测量相电压和直流母线电压。 ADC1和ADC0将同时测量相电压和直流母线电压。图3中的流程图和中断例程描述了处理测量的步骤。
    5.png
                           图3
    1. INTERRUPT void ADC0done_ISR(void)
    2. {
    3. DCBusCurrent = ADC0ResultList[0] - DCBusCurrentOffset;
    4. DCBusVoltageHalf = MLIB_Mul(ADC0ResultList[1]>>1,13653,F16);
    5. phaseVoltage = ADC1ResultList[0]>>1;
    6. bemfVoltage = phaseVoltage - DCBusVoltageHalf;
    7. if (driveStatus.bit.AfterCMT == 1) {
    8. if ((timeBEMF - timeCommutation) > timeZCToff){
    9. driveStatus.bit.AfterCMT = 0;
    10. }
    11. }
    复制代码
    在执行ADC0完成ISR例程之前, ADC会利用DMA,将结果存储到预定义的存储器空间中(也称为ADCx结果列表)。直流母线电流和直流母线电压测量值存储在ADC0结果列表中,相电压存储在ADC1结果列表中。在ADC0完成ISR例程中, ADC结果根据硬件设置缩放,并保存到适当的变量中。 BEMF电压计算为相电压与之差。 BEMF电压值为有符号数值。
    软件将检查换向瞬态时间是否已经通过在软件代码设置中,换向瞬态时间称为Toff (timeZCToff)。

    1. if ((driveStatus.bit.AfterCMT == 0) &&
    2. (driveStatus.bit.NewZC == 0) &&
    3. (driveStatus.bit.Sensorless == 1)){
    4. ZCdetectionAdc[ActualCmtSector]();
    5. bemfVoltageOld = bemfVoltage;
    6. driveStatus.bit.AdcSaved = 1;
    7. if (driveStatus.bit.NewZC) {
    8. GDUPHMUX_GPHMX = BemfPhase[NextCmtSector];
    9. PTUC_PTULDOK = 1;
    10. DCBusCurrentZC = DCBusCurrent;
    11. DCBusCurrentFiltered = (tFrac16)((long)
    12. ((long)DCBusCurrentFiltered +
    13. (long)DCBusCurrentFiltered +
    14. (long)DCBusCurrentFiltered +
    15. (long)DCBusCurrentZC) >> 2);
    16. }
    17. }
    18. if (driveStatus.bit.DisableAdc == 1){
    19. driveStatus.bit.DisableAdc = 0;
    20. driveStatus.bit.NewZC = 0;
    21. }
    22. ADC0CONIF = 1; // Clear flag
    23. }
    复制代码
    在换向瞬态时间TOff尚未到期时,将不会执行过零点计算。如果过零点已经在电流换向期间确定,或者应用在开环模式下运行,那么也不会执行此项计算。
    如果不满足上述条件,过零点检测程序就会执行。根据当前换向扇区,代码执行将会略有差异,因此要向将扇区编号0至5传递给算法。完成过零点位置计算时, BEMF电压值将作为旧值存储,并在下一个PWM周期中再次引用。确定过零点时,读取3个相电压之一的多路复用器将会切换到与下一个换向周期内的相位电压读数相关的那一相。
    此后, PTU的glb_ldok置位,准备接收下一个重载信号,以更改GDU模块中的相位多路复用器。下图中的流程图和代码清单描述了前文所述中断内调用的过零点检测例程。根据实际检测到的相和有效扇区,为上升或下降BEMF电压检测函数调用例程。这里的示例展示了A相的BEMF上升时调用的例程。

    1. void ZCdetectPhAraisingAdc(void)
    2. {
    3. tFrac16 delta;
    4. if (bemfVoltage >= 0){
    5. // Raising approximation
    6. delta = bemfVoltage - bemfVoltageOld;
    7. if ((driveStatus.bit.AdcSaved == 1) &&
    8. (delta > bemfVoltage)) {
    9. timeBEMF -= MLIB_Mul(MLIB_Div(bemfVoltage, delta, F16),
    10. timeBEMF - timeOldBEMF, F16);
    11. }
    12. else{
    13. // middle of previous ADC sensing events
    14. timeBEMF -= ((timeBEMF - timeOldBEMF) >> 1);
    15. }
    16. lastTimeZC = timeZC;
    17. timeZC = timeBEMF;
    18. periodZC_R_PhA = timeZC - lastTimeZC;
    19. actualPeriodZC = (actualPeriodZC + periodZC_R_PhA) >> 1;
    20. NextCmtPeriod = MLIB_Mul(actualPeriodZC,
    21. advanceAngle, F16);
    22. TIM0TC0 = timeZC + NextCmtPeriod;
    23. driveStatus.bit.NewZC = 1;
    24. }
    25. }
    复制代码
    在BEMF电压为负时,尚未通过过零点,因此也无法检测到过零点。软件退出过零点检测例程,过零点状态位仍然未予标记。如果BEMF电压为正数,已经通过过零点,即BEMF电压除以两个测量点的增量,并乘以测量得出的PWM周期(BEMF测量周期)。此计算完成后,旧过零点时间和新过零点时间将保存到适当的变量中。随后根据计算得出的过零点时间和上一个换向周期中的过零点时间计算过零点周期。过零点周期还会进行过滤,以提高可靠性。例程结尾处将会计算新换向时间。这里已经考虑到了部分电机特征。因此并没有将一半的过零点周期加到实际过零点时间之上,而是考虑了所谓的提前角因数,此因数用于比计算时间略提前地激活换向。该因数通常为常数,与电机特征相关。最后,过零点标为已找到,这样既可保证不在当前换向周期内执行计算。





    我知道答案 目前已有0人回答
    很开心
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-27 03:56 , Processed in 0.115710 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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