R5F_0_0 初始化
使用以下步骤初始化电机 1 的 R5F_0_0 (single_chip_servo_remote_core_start):
- 设置 GPIO 引脚方向和初始值 (init_gpio_state)
- 禁用 EPWM (enable_pwm_buffers)
- 为电机 1 设置 EPWM 频率和中断 (init_pwms)
- 为 EnDAT 2.2 电机 1 设置 ICSSG0 PRU1(通道 0,init_encoder)
- 在 ICSSG_SA_MX_REG 寄存器中将 g_mux_en 配置为 1。 HW_WR_REG32((CSL_PRU_ICSSG0_PR1_CFG_SLV_BASE+0x40), (0x80))
- 寄存并启用 ICSSG EnDat PRU FW 中断
-
- 中断号: ICSSG_PRU_ENDAT_INT_NUM
- 回调函数:pruEncoderIrqHandler
- 设置 EnDat 2.2 参数
- gEndat_multi_ch_mask = ENDAT_MULTI_CH0 | ENDAT_MULTI_CH2;
- gEndat_is_multi_ch = CONFIG_ENDAT0_MODE & 1;
- gEndat_is_load_share_mode = CONFIG_ENDAT0_MODE & 2;
- 初始化 ICSSG0 PRU1 (endat_pruss_init)
- 使用编码器驱动程序 API 初始化编码器 (endat_init)
- 使用编码器驱动程序 API 配置编码器 (endat_config_multi_channel_mask)
- 根据 ICSSG 频率配置延迟
- 加载 EnDat 2.2 PRU FW 并运行到 ICSSG0 PRU1 (endat_pruss_load_run_fw)
- 检查来自固件的初始化确认,超时为 5 秒 (endat_wait_initialization)
- 将 2.2 编码器的默认频率设置为 16MHz (endat_init_clock)
- 设置传播延迟,使 16MHz 在 300MHz PRU 下有效 (endat_handle_prop_delay(priv, 265))
- 将 EnDat 2.2 FW 设置为周期性触发 (endat_config_periodic_trigger)
- 配置 EnDat 2.2 FW 周期模式的参数 (endat_config_periodic_mode)
- 通道 0 的 IEP0 CMP3 事件(从 PWM 周期开始算起 3000ns)
- 通道 2 的 IEP0 CMP6 事件(从 PWM 周期开始算起 3000ns)
- 开始接收 EnData 2.2 数据 (endat_handle_rx)
- 为电机 1 的 SDFM 设置 ICSSG0 PRU0 (init_sddf)
- 初始化 IEP0,配置 SYNC0 SD 时钟 (init_IEP0_SYNC)
- 初始化 ICSSG0 PRU0 (initIcss)
- 寄存并启用 ICSSG SDFM RTU FW 中断
- 中断号: ICSSG_RTU_SDDF_INT_NUM
- 回调函数:rtuSddfIrqHandler
- 初始化 SDFM 的 RTU/PRU 内核 (initPruSddf)
- RTU 示例基址:gTestSdfmPrms.samplesBaseAddress
- PRU 示例基址:gTestSdfmPrms.samplesBaseAddress+0x80
- 启动 IEP0 (start_IEP0)
- 为 EPWM0 强制 SW 同步。其他 PWM 通过硬件同步菊花链进行同步 (EPWM_tbTriggerSwSync)
- 禁用 EPWM 输出缓冲器 (enable_pwm_buffers)
- 初始化 FOC 的参数 (init_pids)
- 为电机 1 启用 EPWM 输出缓冲器 (enable_pwm_buffers(TRUE))
R5F_0_0 初始化
使用以下步骤初始化电机 2 的 R5F_0_1 (single_chip_servo_remote_core_start):
- 为电机 2 设置 EPWM 频率和中断 (init_pwms)
- 为电机 2 寄存并启用 ICSSG EnDat PRU FW 中断
- 中断号: ICSSG_PRU_ENDAT_INT_NUM+2
- 回调函数:pruEncoderIrqHandler2
- 为电机 2 寄存并启用 ICSSG SDFM PRU FW 中断
- 中断号: ICSSG_PRU_SDDF_INT_NUM
- 回调函数:pruSddfIrqHandler
- 初始化 FOC 的参数 (init_pids)
EPWM 中断 (50kHz),ISR — App_epwmIntrISR(电机 1)或 App_epwmIntrISR2(电机 2)
SDFM 中断 (50kHz),ISR — rtuSddfIrqHandler(电机 1)或 pruSddfIrqHandler(电机 2)
- 从样本 8192 到 16384,计算 SDFM 通道偏移(0–2 或 3–5)。当 PRECOMPUTE_LEVEL = NO_PRECOMPUTE 时,在 FOC 环路中使用 SDFM 通道偏移
- 在样本 16384 处,为 A 相、B 相和 C 相写入 EPWM,以将转子锁定为电气 0 并禁用 SDFM 中断
- 清除源上的中断
EnDAT 2.2 中断 (50kHz),ISR — pruEncoderIrqHandler(适用于电机 1)
- 清除源上的中断
- 对于样本 0–8192,不执行任何操作
- 对于样本 8193–16383:
- 计算机械和电角偏移 (localEnDatGetSingleMulti)
- 对于样本 16384:
- 找出机械和电角偏移量的平均值
- 关闭所有相
- 保存机械和电角度偏移
- 对于 16384 之后的样本:
- 启动 FOC 环路并解锁转子
- 从编码器获取最新的机械 θ 和多转位置 (localEnDatGetSingleMulti)
- 使用计算得出的相对于电气 0、4 极对的偏移
- 运行 FOC 环路以计算空间矢量
- 写入接下来的 CMPA 值。交换 cmp0 和 cmp2,因为硬件将 EPWM0 连接到 C 相,将 EPWM2 连接到 A 相
- EPWM0 实际上使用 EHRPWM2;EPWM1 使用 EHRPWM1,EPWM2 使用 EHRPWM0
- 有关详细信息,请参阅 single_chip_servo_am243x-lp_r5fss0-0_nortos_ti-arm-clang 中 example_syscfg 内的 EPWM 设置
EnDAT 2.2 中断 (50kHz),ISR — pruEncoderIrqHandler(适用于电机 2)
- 清除源上的中断
- 对于样本 0–8192,不执行任何操作
- 对于样本 8193–16383:
- 计算机械和电角偏移 (localEnDatGetSingleMulti)
- 对于样本 16384:
- 找出机械和电角偏移量的平均值
- 关闭所有相
- 保存机械和电角度偏移
- 对于 16384 之后的样本:
- 启动 FOC 环路并解锁转子
- 从编码器获取最新的机械 θ 和多圈位置 (localEnDatGetSingleMulti)
- 使用计算得出的相对于电气 0、4 极对的偏移
- 运行 FOC 环路以计算空间矢量
- 写入接下来的 CMPA 值。交换 cmp0 和 cmp2,因为硬件将 EPWM0 连接到 C 相,将 EPWM5 连接到 A 相
- EPWM0 实际上使用 EHRPWM5;EPWM1 使用 EHRPWM4,EPWM2 使用 EHRPWM3
- 有关详细信息、请参阅 single_chip_servo_am243x-lp_r5fss0-1_nortos_ti-arm-clang 中 example_syscfg 内的 EPWM 设置