本文主要是介绍【STM32驱动无刷电调遇到的问题及其解决办法】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
STM32驱动无刷电机遇到的问题
- 前言
- 一、PWM驱动代码
- 软件仿真部分
- 使用Keil自带仿真
- 示波器画面
- 总结
前言
提示:这里可以添加本文要记录的大概内容:
使用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);//开启GPIOARCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//开启TIM3RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启复用AFIOGPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_6;//引角PA6,PA7GPIO_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 成功驱动无刷电调。
驱动不足原因,高电平电压不足。
解决方案:三极管放大
这篇关于【STM32驱动无刷电调遇到的问题及其解决办法】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!