查看: 2460|回复: 1

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

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

    [LV.3]偶尔看看II

    126

    主题

    525

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2018
    最后登录
    2023-12-25
    发表于 2017-3-7 22:03:58 | 显示全部楼层 |阅读模式
    5.TIM
    定时器模块(TIM)是一种基础可缩放定时器,包括由灵活的可编程预分频器驱动的16位软件可编程计数器。 BLDC无传感器算法在输出比较模式下利用两个定时器通道(TIM0TIOS_IOS0 = 1;TIM0TIOS_IOS3 = 1)。
    定时器通道0用于识别换向事件。输出比较信号作为async_event在内部路由到PMF模块,以执行PWM对的换向。定时器计数器达到输出比较通道的通道寄存器中的值时,定时器将切换(TIM0TCTL2_OL0 = 1; TIM0TCTL2_OM0 = 0)通道输出。此通道还会在某些应用标志受控的
    位置安排中断(TIM0TIE_C0I = 1)。
    定时器通道3用于通过软件任务控制电机转矩。定时器通道3安排周期性中断(TIM0TIE_C3I = 1),周期为1 ms (TIM0TC3 = 781)。定时器的预分频等于4 (TIM0TSCR2_PR = 4),所有定时器输出比较引脚均断开连接(TIM0OCPD =0xff)。
    6.GDU
    栅极驱动单元(GDU)是一种场效应晶体管(FET)预驱动器,专为三相电机控制应用而设计。 BLDC无传感器控制中采用了以下GDU功能:
    电荷泵: 用于在PWM以100%占空比运行时,保持高压侧驱动器栅源电压VGS。电荷泵的时钟设置为 (GDUCLK2_GCPCD = 2)
    去饱和错误: 集成三个适用于低压侧FET预驱动器的去饱和比较器,以及三个适用于高压侧FET预驱动器的去饱和比较器。低压侧和高压侧FET的去饱和级别均设置为1.35 V(GDUDSLVL = 0x77)。应用此功能时需要用到FET瞬态期间的消隐时间。消隐时间设置为大约8 µs (GDUCTR = 0x13)。
    相位复用: 用于选择要在内部路由到ADC1通道2的相电压(GDUPHMUX)。
    电流感应放大器: 内部电流感应放大器0 (GDUE_GCSE0 = 1)用于测量电机相电流。电流感应放大器0的输出在内部路由到ADC0通道0。
    7.ADC
    MC9S12ZVML128使用两个独立的模数转换器(ADC)。两个ADC均为n通道多路复用输入连续近似模数转换器。基于列表的架构(LBA)提供灵活的转换序列定义以及灵活的过采样。两个ADC转换命令列表均存储在全局存储器映像内;即以二维字节数组的形式(ADC0CommandList[][],ADC1CommandList[][])存储在系统存储器内。 ADC转换命令在系统存储器内的准确位置由链接器命令文件指定,并在初始化阶段链接到对应的ADC模块。 ADC结果也采用了相同的策略。转换结果存储在系统存储器内的short型数组中(ADC0ResultList[], ADC1ResultList[])。
    1. // ADC0 Command Base Pointer
    2. ADC0CBP_0 = (uint8_t)(((long)ADC0CommandList) >> 16);
    3. ADC0CBP_1 = (uint8_t)(((long)ADC0CommandList) >> 8);
    4. ADC0CBP_2 = (uint8_t)((long)ADC0CommandList);
    5. // ADC0 Command Base Pointer
    6. ADC0RBP_0 = (uint8_t)(((long)ADC0ResultList) >> 16);
    7. ADC0RBP_1 = (uint8_t)(((long)ADC0ResultList) >> 8);
    8. ADC0RBP_2 = (uint8_t)((long)ADC0ResultList);
    9. // ADC1 Command Base Pointer
    10. ADC1CBP_0 = (uint8_t)(((long)ADC1CommandList) >> 16);
    11. ADC1CBP_1 = (uint8_t)(((long)ADC1CommandList) >> 8));
    12. ADC1CBP_2 = (uint8_t)(long)ADC1CommandList);
    13. // ADC1 Result Base Pointer
    14. ADC1RBP_0 = (uint8_t)(((long)ADC1ResultList) >> 16);
    15. ADC1RBP_1 = (uint8_t)(((long)ADC1ResultList) >> 8);
    16. ADC1RBP_2 = (uint8_t)((long)ADC1ResultList);
    复制代码
    ADC转换时钟设置为6.25 MHz (ADC0TIM = 0; ADC1TIM = 0)。 结果以12位(ADC0FMT_SRES = 4;ADC1FMT_SRES = 4)左对齐数据(ADC0FMT_DJM = 0; ADC1FMT_DJM = 0)的形式存储在存储器内。
    两个ADC的转换流均由内部信号(由PTU生成)和数据母线(ADC0CTL_0_ACC_CFG = 3;ADC1CTL_0_ACC_CFG = 3)控制。即便在转换过程中发生换向(ADC0CTL_0_STR_SEQA = 1;ADC1CTL_0_STR_SEQA = 1),结果也会存储在系统存储器内。ADC0将安排列表结束中断(ADC0CONIE_1_EOL_IE = 1),计算BEMF过零点算法。BLDC无传感器算法使用ADC0测量电机相电流和直流母线电压。 ADC1用于测量对应的电机相电压。




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

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-2-13 08:29
  • 签到天数: 20 天

    [LV.4]偶尔看看III

    531

    主题

    2048

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    210
    最后登录
    2018-8-14
    发表于 2017-3-8 09:28:52 | 显示全部楼层
    不错不错
    签到 签到
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-27 01:40 , Processed in 0.110016 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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