提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
使用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 成功驱动无刷电调。
驱动不足原因,高电平电压不足。
解决方案:三极管放大