【STM32驱动无刷电调遇到的问题及其解决办法】

本文探讨了使用STM32开发无刷电机驱动时遇到的问题,重点在于PWM输出的高电平不足导致驱动困难。通过软件仿真和示波器观察,作者分享了如何通过三极管放大解决电压不足问题,以及如何配置PWM模块。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

使用STM32开发板进行无刷电调的驱动开发,发现舵机测试仪可以轻松驱动无刷电机旋转和调速,而自己拟写的PWM程序则无法驱动。后面上示波器抓波,终于发现了端倪,不知道大家是如何解决的。欢迎评论


提示:以下是本篇文章正文内容,下面案例可供参考

一、PWM驱动代码

正点原子开发例程修改而来
pwm.c文件

#include "pwm.h"
void My_TIM3_Init(u16 arr,u16 psc)//初始化
{
	GPIO_InitTypeDef GPIO_InitStruct;//gpio结构体
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;//定时器结构体
	TIM_OCInitTypeDef TIM_OCInitStruct;//通道结构体
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIOA
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//开启TIM3
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启复用AFIO
  
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_6;//引角PA6,PA7
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);//GPIO初始化
	
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//分频因子
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
	TIM_TimeBaseInitStruct.TIM_Period=arr;//自动重装载值
	TIM_TimeBaseInitStruct.TIM_Prescaler=psc;//预分频系数
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);//初始化
	
	TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;
	TIM_OCInitStruct.TIM_OCNPolarity=TIM_OCPolarity_High;
	TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
	
	TIM_OC1Init(TIM3,&TIM_OCInitStruct);//通道1初始化
	TIM_OC2Init(TIM3,&TIM_OCInitStruct);//通道2初始化
	
	TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);  //使能预装载寄存器
	TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
  	TIM_Cmd(TIM3,ENABLE);        //使能TIM3
		
}

main.c文件


#include "stm32f10x.h"
#include "delay.h"
#include "pwm.h"

int main(void)
{	
	int i = 0;
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

	delay_init();
	My_TIM3_Init(19999,71);//周期为20ms  (arr+1)(psc+1)/Tclk=20000*72/72000000=20ms

	//TIM_SetCompare1(TIM3,700);//油门最高点                改占空比,计算方法500/20000=0.5/20
	//Delay_s(1);//	延迟2秒
	//TIM_SetCompare1(TIM3,1000);//油门中位
		while(1)
		{		

			
			for(i = 800; i < 2000;i++)
			{
			  TIM_SetCompare1(TIM3,i);//	保持
				delay_ms(1);
			}
			Delay_s(1);
			for(i = 2000; i > 800;i--)
			{
			  TIM_SetCompare1(TIM3,i);//	保持
				delay_ms(1);
			}
            Delay_s(1);
		}
}

软件仿真部分

使用Keil自带仿真

在这里插入图片描述

示波器画面

这是单片机输出的PWM经过三极管放大后的波形 输出高电平为5V 因为只用了一个三极管 所以波形会取反
在这里插入图片描述

这是单片机配置为PWM2模式输出的波形,高电平为3.3V 且占空比很大
在这里插入图片描述
电路图如下
在这里插入图片描述
当然 如果感觉修改程序PWM2模块 反向麻烦的话 那就硬件再次放大,相当于再次反向就好,这样输入和输出同向。
电路图如下
在这里插入图片描述


总结

经过三极管放大后 输出的PWM高电平为5V 成功驱动无刷电调。
驱动不足原因,高电平电压不足。
解决方案:三极管放大

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值