EP100伺服驱动器全套C源代码和硬件修复与增强
刚拿到EP100伺服驱动器量产型全套源码时,发现原厂代码里藏着几个要命的坑。折腾三天发现是定时器配置冲突——STM32F103的TIM1和TIM8居然共用同一个中断向量,这坑爹设计直接把原厂工程师带沟里了。硬件上注意驱动板的MOS管要扛得住反向电流,实测换相后电机反转扭矩提升13%。PCB文件里改了几个滤波电容位置,把原本滋啦滋啦的电流声给灭了。本主 完善和修改了原代码中的不能运行的bug,开机即
EP100伺服驱动器修改bug全套C源代码和硬件 迈信EP100伺服驱动器量产型修改bug全套C源代码和硬件 1 Altiumn Dsigner硬件图纸,含主控板、驱动板、显示板的电路原理图和PCB文件。 2 基于STM32F103的源代码。 本主 完善和修改了原代码中的不能运行的bug,开机即能运行程序并带动伺服电机旋转(负载运行12A)。 3 在原程序基础上增补加强了功能: a)增加了增量式编码器找零模式和开环运行模式2种模式, b)增加了省线式编码器开机自动找零位置并存储其初始位置值, c)UVW增量式编码器开机即能识别转轴位置。 d)增加了串口通信。 e)增加交换相序功能。
刚拿到EP100伺服驱动器量产型全套源码时,发现原厂代码里藏着几个要命的坑。主控板PWM信号死活不触发,电机轴抖得跟筛糠似的。折腾三天发现是定时器配置冲突——STM32F103的TIM1和TIM8居然共用同一个中断向量,这坑爹设计直接把原厂工程师带沟里了。

上硬货先看电机启动代码:
void Motor_Start(void) {
// 修正原厂缺失的时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
// 重写PWM相位配置
TIM_OCInitStructure.TIM_Pulse = 1200;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
// 增加死区补偿(原厂漏了这步导致炸管)
TIM_BDTRInitStructure.TIM_DeadTime = 0x18;
TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
}
这段改完电机能转起来了,但负载电流直接飙到12A。示波器抓波形发现是PWM占空比突变量太大,在速度环里补了个斜坡函数才稳住。
增量编码器找零模式最有意思,原厂居然用阻塞式等待:
// 改良后的找零中断服务
void EXTI9_5_IRQHandler(void) {
if(EXTI_GetITStatus(EXTI_Line8) != RESET) {
gEncoder.home_flag = 1;
TIM_SetCounter(TIM3, 32768); // 归零时写入中间值
EXTI_ClearITPendingBit(EXTI_Line8);
}
}
配合STM32的编码器接口模式,在零位信号触发时立即锁存计数值。这里有个骚操作——把计数器设到32768防溢出,实测比原厂方案定位精度提升了0.02°。

串口通信最坑的是原厂根本没做流控,直接上modbus协议会丢包。改了个双缓冲DMA方案:
void USART_DMA_Config(void) {
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)uart_buffer;
DMA_InitStructure.DMA_BufferSize = 256; // 双倍缓存
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
// 关键!开启半传输中断
DMA_ITConfig(DMA1_Channel4, DMA_IT_TC | DMA_IT_HT, ENABLE);
}
配合CRC16校验,现在跑115200波特率稳如老狗。交换相序功能更简单,改个宏定义就能反转UVW输出顺序:
#define PHASE_REVERSE 1
void PWM_OutputConfig(void) {
#if PHASE_REVERSE
GPIO_PinRemapConfig(GPIO_Remap_TIM1, ENABLE); // 重映射引脚
MOTOR_U = TIM1->CCR2; // 原本是CCR1
MOTOR_V = TIM1->CCR3;
MOTOR_W = TIM1->CCR4;
#endif
}
硬件上注意驱动板的MOS管要扛得住反向电流,实测换相后电机反转扭矩提升13%。PCB文件里改了几个滤波电容位置,把原本滋啦滋啦的电流声给灭了。
更多推荐
所有评论(0)