用stm32输出pwm波使无刷电机转起来

发布者:TranquilDreams最新更新时间:2018-06-28 来源: eefocus关键字:stm32  输出pwm波  无刷电机 手机看文章 扫描二维码
随时随地手机看文章

现阶段使用stm32,基本处于模仿阶段,用野火的教程以及程序,修改一些IO口,然后烧到自己的开发板上,实现一些功能。

第二个实验室了解pwm波这个东西,脉宽调制,调节占空比可以改变电机转速,原理可以看刘洋老师的基础视频,讲的很详细。

修改野火的pwm程序,野火用了四个通道,我只用了TIM4的第一通道,程序如下:

#include "pwm_output.h"

void pwm_value(void)

{

TIM4->CCR1=1300;

}

/*

 * 函数名:TIM3_GPIO_Config

 * 描述  :配置TIM3复用输出PWM时用到的I/O

 * 输入  :无

 * 输出  :无

 * 调用  :内部调用

 */

static void TIM4_GPIO_Config(void) 

{

  GPIO_InitTypeDef GPIO_InitStructure;

 

/* TIM4 clock enable */

//PCLK1经过2倍频后作为TIM3的时钟源等于72MHz

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); 

  /*GPIOB clock enable */

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); 

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    // 复用推挽输出

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; 

 

  GPIO_Init(GPIOB, &GPIO_InitStructure);

  // 复位定时器。

  TIM_DeInit(TIM4);

}

 

/*

 * 函数名:TIM4_Mode_Config

 * 描述  :配置TIM3输出的PWM信号的模式,如周期、极性、占空比

 * 输入  :无

 * 输出  :无

 * 调用  :内部调用

 */

static void TIM4_Mode_Config(void)

{

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

TIM_OCInitTypeDef  TIM_OCInitStructure;

 

/* PWM信号电平跳变值 */

u16 CCR1_Val =990;        

// u16 CCR2_Val = 375;

// u16 CCR3_Val = 250;

// u16 CCR4_Val = 125;   

 

/* -----------------------------------------------------------------------

    TIM3 Configuration: generate 4 PWM signals with 4 different duty cycles:

    TIM3CLK = 72 MHz, Prescaler = 0x0, TIM3 counter clock = 72 MHz

    TIM3 ARR Register = 999 => TIM3 Frequency = TIM3 counter clock/(ARR + 1)

    TIM3 Frequency = 72 KHz.

    TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50%

    TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 = 37.5%

    TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100 = 25%

    TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100 = 12.5%

  ----------------------------------------------------------------------- */

 

  /* Time base configuration */  

  TIM_TimeBaseStructure.TIM_Period = 3999;       //当定时器从0计数到999,即为1000次,为一个定时周期

  TIM_TimeBaseStructure.TIM_Prescaler = 71;    //设置预分频:不预分频,即为72MHz

  TIM_TimeBaseStructure.TIM_ClockDivision = 0 ; //设置时钟分频系数:不分频

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式

  TIM_ARRPreloadConfig(TIM4, ENABLE); // 使能TIM4重载寄存器ARR

  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

 

  TIM_OCStructInit(&TIM_OCInitStructure);

  /* PWM1 Mode configuration: Channel1 */

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;    //配置为PWM模式1

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

  TIM_OCInitStructure.TIM_Pulse = CCR1_Val;   //设置跳变值,当计数器计数到这个值时,电平发生跳变

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //当定时器计数值小于CCR1_Val时为高电平

 

  TIM_OC1Init(TIM4, &TIM_OCInitStructure); //使能通道1

 

  TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);

 

  /* TIM3 enable counter */

  TIM_Cmd(TIM4, ENABLE);                   //使能定时器3

}

 

/*

 * 函数名:TIM3_PWM_Init

 * 描述  :TIM3 输出PWM信号初始化,只要调用这个函数

 *         TIM3的四个通道就会有PWM信号输出

 * 输入  :无

 * 输出  :无

 * 调用  :外部调用

 */

void TIM4_PWM_Init(void)

{

TIM4_GPIO_Config();

TIM4_Mode_Config();

}

 

/******************* (C) COPYRIGHT 2012 WildFire Team *****END OF FILE************/


当然,野火用的是TIM3,我用的是TIM4

主函数:


#include "stm32f10x.h"

#include "pwm_output.h"

 

/*

 * 函数名:main

 * 描述  :主函数

 * 输入  :无

 * 输出  :无

 */

int main(void)

{

  

while (1)

{}

}


这个程序编译的时候没出现问题,软件仿真的时候也能出现pwm波,下载到开发板上也成功了,但是电机就是不转,百思不得其解。

找学长看了一下,加了个延时函数,就成功了,说是电调初始化需要点时间,然后主函数改成了:


#include "stm32f10x.h"

#include "pwm_output.h"

 

/*

 * 函数名:main

 * 描述  :主函数

 * 输入  :无

 * 输出  :无

 */

int main(void)

{

   int i, j;

/* TIM3 PWM波输出初始化,并使能TIM3 PWM输出 */

TIM4_PWM_Init();

for( i=0;i<20000;i++)

{

for ( j=0;j<1000;j++)

{

}

}

pwm_value();

while (1)

{}

}


还是挺简单的嘛。


关键字:stm32  输出pwm波  无刷电机 引用地址:用stm32输出pwm波使无刷电机转起来

上一篇:stm32 PWM & 定时器总结
下一篇:STM32F407ZET6 关于用PWM(做出呼吸灯)详解

推荐阅读最新更新时间:2024-03-16 16:07

6步教你在STM32程序中添加 printf函数
简介:6步教你在STM32程序中添加 printf函数 前提是你有一个完整的keil工程 比如ADC的 调试的时候很多时候用到串口 这里教你怎么样使用Printf 函数 在程序中添加Printf 1, #include stdio.h 2, /* Private functions ---------------------------------------------------------*/ 下添加 void USART_Configuration(void); #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker
[单片机]
STM32 IAP 升级功能
IAP In Application Programming 可通过USB,CAN,UART,I2C,SPI等接口实现 IAP流程 Bootloader程序:接收升级程序,更新到flash指定地址;跳转到指定地址执行 STM32设置 ①:为Bootloader预留0x10000空间 ②:设置APP程序的起始地址 ③:中断向量表的偏移量设置 ④:生成bin文件 详见:https://blog.csdn.net/zhangxuechao ⑤:代码更新FLASH固件,执行FLASH代码 举例 //appxaddr:应用程序的起始地址 //appbuf:应用程序CODE. //appsize:应用程序大小(字节).
[单片机]
<font color='red'>STM32</font> IAP 升级功能
STM32串口通信之Hello(STM32_11)
一、开发板硬件介绍 1、MCU串口管脚 本程序使用STM32F103ZET6芯片,芯片有5个串口,其中有3个USART和两个UART,本程序使用异步方式,5个串口的管脚。 2、卡发板串口电路 ① USART1的电路连接 开发板中将USART1的TX(USART1_TXD, PA9)和RX(USART1_RXD, PA10)连接至CH340G (USB转串口芯片)的TXD和RXD,在TXD引脚串联一个二极管是为了防止CH340G给单片机供电而使单片机不能正常断电,从而导致程序下载失败。DTR连RSET可以实现程序下载完成后自动复位系统。下载程序时通过RTS将BOOT0拉低。 ② USART3的电路连接
[单片机]
<font color='red'>STM32</font>串口通信之Hello(STM32_11)
如何在STM32中要实现数据通讯
在stm32中要实现数据通讯,首先要设置相关的寄存器,这里不做相关的介绍,直接说代码相关的能内容及相关函数对应的用法。 直接上代码。 1.串口通讯代码 usart.h #ifndef __USART_H #define __USART_H #include stdio.h #include sys.h #define USART_REC_LEN 200 //定义最大接收字节数 200 #define EN_USART3_RX 1 //使能(1)/禁止(0)串口1接收 extern u8 USART_RX_BUF ; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符 ex
[单片机]
如何在<font color='red'>STM32</font>中要实现数据通讯
关于contiki系统到STM32的移植
1.contiki简介 Contiki是一个小型的,开源的,极易移植的多任务操作系统。它专门设计以适用于一系列的内存优先的网络系统,包括从8位电脑到微型控制器的嵌入系统。它的名字来自于托尔 海尔达尔的康提基号。Contiki只需几kilobyte的代码和几百字节的内存就能提供多任务环境和内建TCP/IP支持。 2.移植前的准备 首先建立一个最简单工程。一个最简单的任务莫过于LED闪烁了,从学习51单片机开始,到AVR,到ARM,从移植uCOS到移植contiki。LED闪烁无疑是最棒的任务。假设这个任务就是LED点亮1秒,然后LED熄灭1秒。Contiki的采用事件驱动机制,那么如何才能够产生 事件 呢。答案只有两个:第一,通
[单片机]
关于contiki系统到<font color='red'>STM32</font>的移植
stm32使用FPU时注意事项
除了网上的教程外,还要特别注意,当运算中有浮点的数字时要把,数字后面加上一个f。例如表达式中有4.321参与运算。。当你不在4.321后加f时,stm32F405的片子不知道把他当做单精度float用FPU来运算,,默认可能是当做double来运算(我不确定),运算速度还是很慢。。切记所有浮点数字后面加上f,,,,有时候keil会提示warning: #1035-D: single-precision operand implicitly converted to double-precision 这句话的意思就是单精度运算隐式转换成了双精度运算了。这个时候就要在单精度数字后面加个f keilmdk的设置中完整的define是
[单片机]
STM32学习历程之IO口输出方式
推挽输出(PUSH-Pull Output):在功率放大器电路中大量采用推挽放大器电路,这种电路中用两只三极管构成一级放大器电路,两只三极管分别放大输入信号的正半周和负半周,即用一只三极管放大信号的正半周,用另一只三极管放大信号的负半周,两只三极管输出的半周信号在放大器负载上合并后得到一个完整周期的输出信号。推挽放大器电路中,一只三极管工作在导通、放大状态时,另一只三极管处于截止状态 ,当输入信号变化到另一个半周后,原先导通、放大的三极管进入截止,而原先截止的三极管进入导通、放大状态,两只三极管在不断地交替导通放大和截止变化,所以称为推挽放大器。 这种电路只要用于低功耗情况下能输出较大功率的交流信号,通常用于低频放大电路设计中,可
[单片机]
STM32单片机特性解析
STM32单片机 由ST厂商推出的STM32系列单片机,行业的朋友都知道,这是一款性价比超高的系列单片机,应该没有之一,功能及其强大。其基于专为要求高性能、 低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M内核,同时具有一流的外设:1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI等等,在功耗和集成度方面也有不俗的表现,当然和MSP430的功耗比起来是稍微逊色的一些,但这并不影响工程师们对它的热捧程度,由于其简单的结构和易用的工具再配合其强大的功能在行业中赫赫有名。其强大的功能主要表现在: 特性 1、内核:ARM32位Cortex-M3CPU,最高工作频率72MHz,1.25DMIPS/MHz,单周
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved