小四轴——空心杯电机引起的电源干扰

问题

用STM32做了一个微型四轴的飞控,使用的是空心杯电机,使用一个MOS管驱动,但是现在电机只要运行起来,就会产生非常大的干扰,直接导致STM32复位或不运行。经过换电容,加二极管续流,换LDO芯片,加电感进行滤波,花费了大量时间,最后终于解决了这个问题。

电机驱动部分

电机驱动我开始是使用的0.1uf电容进行电机的续流,但是后来发现干扰太大,换为了肖特基二极管进行续流,然而发现产生干扰的地方并不是此处。我们电机是使用MOS管将PWM信号进行放大的,PWM信号就是一系列的方波,这需要MOS管进行频繁的开关,在MOS进行开关时噪声就产生了,就是说该噪声是跟随PWM频率而变化的。这是驱动部分电路图以及我使用示波器观察到的噪声
驱动电路
这里写图片描述

电源部分

从上面示波器输出可以看出,我使用的是1S锂电池,电压范围为3.7~4.2V,电源我直接使用了一个LDO将电压降下来,这就导致了上述那个电压尖峰直接让我的LDO停止工作了,这是电源电路
这里写图片描述
实际我选择LDO的型号是特瑞斯的XC6206,LDO有一项指标是PSRR,即Power Supply Rejection Ratio
,电源抑制比,查看该芯片数据手册:
这里写图片描述
可以看到噪声为1KHz时,抑制比已经大幅下降了,而我的PWM频率是5KHz,也就是说噪声也是5KHz,所以应该选一款PSRR高的芯片,这里又重新购买了MCP1700替换上面的xc6206,然后发现电机能够转了,测量LDO输出电压为3.3V。
接下来的我发现虽然STM32能够控制电机,但是电机旋转时,nfs24l01模块又停止了工作,就是说仍然有噪声存在,重新查看别人小四轴的原理图,发现他们都在电源部分用了一个电感来进行滤波,抱着试一试的心态,将0R电阻换为了2.2uh的贴片电感,最后nfs24l01居然能够正常工作,问题解决。

总结

其实最根本的解决办法是重新设计电源部分,使用先升压到5V再降压到3.3V的方案,这样可以避免电机运行中电压掉得太低超过了LDO的范围的情况,这里贴一个能用的电源电路,是CrazePony的方案。
升压
降压
另外贴一下CrazePony的硬件设计:
http://www.crazepony.com/wiki/hardware-base.html

  • 17
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
根据提供的引用内容,关于STM32F103C8T6开发板和空心杯无人机的制作,可以参考以下步骤: 1. 了解STM32F103C8T6开发板:STM32F103C8T6是一款基于ARM Cortex-M3内核的微控制器,具有丰富的外设和强大的性能,适合用于四轴飞行器的控制。 2. 选择空心杯无人机机架:空心杯无人机机架是一种轻巧稳固耐摔的机架,适合用于DIY四轴飞行器。可以在某宝等平台上搜索并购买适合的机架。 3. 选择合适的电机:根据需求选择合适的电机,可以参考引用中提到的通用720空心杯电机电机的选择要考虑推力、功率和重量等因素。 4. 连接电机和开发板:将电机连接到开发板的PWM输出引脚上,以便控制电机的转速和方向。 5. 添加加速度计模块:可以使用GY521加速度计模块来获取飞行器的姿态信息,以便进行姿态控制。 6. 编写飞行控制程序:使用STM32F103C8T6开发板的开发环境,如Keil或STM32CubeIDE,写飞行控制程序。程序需要实现姿态控制、电机控制和通信等功能。 7. 调试和测试:将开发板连接到计算机上,烧录飞行控制程序,并进行调试和测试。可以使用串口通信或者无线通信模块与地面站进行通信。 8. 完善和优化:根据实际需求,对飞行控制程序进行完善和优化,提高飞行器的性能和稳定性。 以下是一个示例的代码片段,用于控制四个电机的转速: ```c #include <stm32f10x.h> // 定义电机控制引脚 #define MOTOR1_PIN GPIO_Pin_0 #define MOTOR2_PIN GPIO_Pin_1 #define MOTOR3_PIN GPIO_Pin_2 #define MOTOR4_PIN GPIO_Pin_3 // 初始化电机控制引脚 void Motor_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = MOTOR1_PIN | MOTOR2_PIN | MOTOR3_PIN | MOTOR4_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } // 设置电机转速 void SetMotorSpeed(uint16_t speed1, uint16_t speed2, uint16_t speed3, uint16_t speed4) { TIM_SetCompare1(TIM1, speed1); TIM_SetCompare2(TIM1, speed2); TIM_SetCompare3(TIM1, speed3); TIM_SetCompare4(TIM1, speed4); } int main(void) { // 初始化电机控制引脚 Motor_Init(); // 设置电机转速 SetMotorSpeed(1000, 1000, 1000, 1000); while (1) { // 主循环 } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值