stm32通过电调带动电机(可按键调速)

发布者:乐观向前最新更新时间:2020-01-07 来源: eefocus关键字:stm32  电调  带动电机  按键调速 手机看文章 扫描二维码
随时随地手机看文章

这几天在做32通过电调带动电机的实验,上网一查,发现这方面的资料很少,经过自己的亲自实践,总结出以下经验,供大家参考。


论坛上也有很多人说自己在做,但是都遇到了同样的瓶颈。我想他们大多是pwm的频率和占空比没有调到合适的值吧。


首先,我在网上只找到一片很好的文章,是瑞生大神写的:http://www.rationmcu.com/lpc1114/1126.html


我的电机是银燕2212/1400kv经典电机 ,电调也是银燕40A无刷电调。


通过它知道,当pwm设置为500hz的 时候电调才能正常的工作,刚开始时高电平时间要控制在0.7-1.9左右,让电机带电自检。


通过按键控制占空比可以很好地 实现这一点。


好了,下面上我的代码。


先来头文件吧


#ifndef _Motor_H_

#define _Motor_H_

#include "stm32f10x.h"


/******************************************************************************

                            全局函数声明

*******************************************************************************/ 

void Motor_Init(void);

//void Motor_Out(int16_t duty1,int16_t duty2,int16_t duty3,int16_t duty4);


#endif

 

主菜:


  1 /***************************************************************************************

  2   1/给单片机写程序:使得某引脚输出500Hz的PWM信号,初始化时高电平时间设置为1.9ms,

  3   然后在while循环里面加入检测按键的程序,当按键按下,把高电平设置为0.7ms。

  4     2/1.给单片机写程序,把刚才的PWM初始化的高电平设置为0.7ms,保证刚上电,电调不会让电机转动。

  5     然后给修改按键按下的程序,修改为,按一次按键,高电平时间增加一点点,最大增加到1.9ms。

  6     

  7     我的按键再c13(k2)和e0(k1)

  8     日期:2016.3.4

  9 ***************************************************************************************/

 10 

 11 #include "dianji.h"

 12 

 13   uint8_t indexWave[] = {5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};  //占空比表

 14     

 15 //声明函数

 16 void Tim2_init(void);

 17 void Motor_Init(void);

 18 void Init_NVIC(void);

 19 void Delay_Ms(uint16_t time);  

 20 void Delay_Us(uint16_t time); 

 21 void Init_TI_KEY(void);

 22 

 23         

 24 int main(void)

 25 {

 26  

 27     SystemInit();                //系统时钟配置

 28     Motor_Init();

 29     Tim2_init();

 30     Init_NVIC();                //中断向量表注册函数

 31     Init_TI_KEY();                //按键引脚中断初始化

 32     

 33     while(1);

 34     

 35 }

 36 

 37 

 38 void Tim2_init(void)

 39 {    

 40     

 41     TIM_TimeBaseInitTypeDef        TIM_TimeBaseStructure;

 42     TIM_OCInitTypeDef              TIM_OCInitStructure;

 43     

 44      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

 45     

 46     TIM_TimeBaseStructure.TIM_Period = 20-1;    //设置ARR的值为19,从0计数到19,刚好是2ms ,500hz

 47     TIM_TimeBaseStructure.TIM_Prescaler = 7200-1;//设置PSC的值为7199,这样的话每计数一次为0.1ms 

 48     

 49     

 50     TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

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

 52     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseStructure中指定的参数初始化外设TIM2

 53     

 54     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式

 55     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

 56     

 57     TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值,刚开始可以设置为0.

 58     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高

 59     

 60     TIM_OC1Init(TIM2, &TIM_OCInitStructure); 

 61     TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR1上的预装载寄存器

 62 

 63     TIM_ARRPreloadConfig(TIM2, ENABLE); //使能TIM2在ARR上的预装载寄存器

 64     TIM_Cmd(TIM2, ENABLE);  //使能TIM2外设

 65 }

 66 

 67 /******************************************************************************

 68 函数原型:    void Motor_Init(void)

 69 功    能:    PWM初始化

 70 *******************************************************************************/ 

 71 void Motor_Init(void)

 72 {

 73     

 74     GPIO_InitTypeDef GPIO_InitStructure;

 75     

 76     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);   //使能电机用的时钟

 77     

 78     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;     //设置电机使用到得管脚

 79     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

 80     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 

 81     GPIO_Init(GPIOA, &GPIO_InitStructure);

 82 

 83 }

 84 

 85 /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 86 ** 函数名称: KEY_TI_Init

 87 ** 功能描述: 按键 中断配置 

 88 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/

 89 void Init_TI_KEY(void)

 90 {

 91     EXTI_InitTypeDef  EXTI_InitStructure;                    //定义一个EXTI结构体变量

 92 

 93     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);        //使能IO复用功能,使用中断功能重要!!!

 94 

 95     GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);//配置端口C的13引脚为中断源      重要!! 板上标号INT2

 96     GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource0); //配置端口E的0引脚为中断源      重要!! 板上标号INT1

 97     EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line13;//

 98     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        //中断模式为中断模式

 99     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;    //下降沿出发

100     EXTI_InitStructure.EXTI_LineCmd = ENABLE;                //使能中断线

101     EXTI_Init(&EXTI_InitStructure);                            //根据参数初始化中断寄存器

102 }

103 

104 /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

105 ** 函数名称: Init_NVIC

106 ** 功能描述: 系统中断配置

107 

108 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/

109 void Init_NVIC(void)

110 { 

111     NVIC_InitTypeDef  NVIC_InitStructure;

112          

113     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                  //设置中断优先级分组2

114 

115     NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;        //设定中断源为PC13

116     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;    //中断占优先级为2

117     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            //副优先级为0

118     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                //使能中断

119     NVIC_Init(&NVIC_InitStructure);                                   //根据参数初始化中断寄存器

120 

121     NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;            //设定中断源为PE0

122     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;    //中断占优先级为1

123     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            //副优先级为0

124     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                //使能中断

125     NVIC_Init(&NVIC_InitStructure);                                   //根据参数初始化中断寄存器

126 }

127 

128 

129 /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

130 ** 函数名称: EXTI15_10_IRQHandler

131 ** 功能描述: 中断15_10入口函数            

132 

133 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/

134 void EXTI15_10_IRQHandler(void)   //占空比减小

135 {

136     static uint8_t pwm_index = 0;            //用于PWM查表

137     static uint8_t period_cnt = 0;        //用于计算周期数

138     //就是上面两个静态变量没有设置 ,导致一开始按键只能按一次,在往下按他的pwm表就不往下查表了,我想了一晚上啊。

139     //今天早晨我突然发现可能是这两个静态变量没有设置,一试,果然。开心至极。2016.3.5

140     

141     if(EXTI_GetITStatus(EXTI_Line13)!= RESET)      //判断是否发生中断,发生则中断标志置1

142     {

143            Delay_Ms(5);  //消抖

144 

145              period_cnt++;            

146                 

147                 TIM2->CCR1 = indexWave[pwm_index];    //根据PWM表修改定时器的比较寄存器值

148                 pwm_index++;                                                //标志PWM表的下一个元素

149             

[1] [2]
关键字:stm32  电调  带动电机  按键调速 引用地址:stm32通过电调带动电机(可按键调速)

上一篇:STM32过滤器的作用
下一篇:对GPIO_Init(GPIOx,&GPIO_InitStructure)的理解

推荐阅读最新更新时间:2024-10-25 12:53

stm32通过电调带动电机(可按键调速
这几天在做32通过电调带动电机的实验,上网一查,发现这方面的资料很少,经过自己的亲自实践,总结出以下经验,供大家参考。 论坛上也有很多人说自己在做,但是都遇到了同样的瓶颈。我想他们大多是pwm的频率和占空比没有调到合适的值吧。 首先,我在网上只找到一片很好的文章,是瑞生大神写的:http://www.rationmcu.com/lpc1114/1126.html 我的电机是银燕2212/1400kv经典电机 ,电调也是银燕40A无刷电调。 通过它知道,当pwm设置为500hz的 时候电调才能正常的工作,刚开始时高电平时间要控制在0.7-1.9左右,让电机带电自检。 通过按键控制占空比可以很好地 实现这一点。
[单片机]
stm32通过电调带动电机
这几天在做32通过电调带动电机的实验,上网一查,发现这方面的资料很少,经过自己的亲自实践,总结出以下经验,供大家参考。 论坛上也有很多人说自己在做,但是都遇到了同样的瓶颈。我想他们大多是pwm的频率和占空比没有调到合适的值吧。 首先,我在网上只找到一片很好的文章,是瑞生大神写的:http://www.rationmcu.com/lpc1114/1126.html 我的电机是银燕2212/1400kv经典电机 ,电调也是银燕40A无刷电调。 通过它知道,当pwm设置为500hz的 时候电调才能正常的工作,刚开始时高电平时间要控制在0.7-1.9左右,让电机带电自检。 通过按键控制占空比可以很好地 实现这一点。 好了,下面上我的代码。
[单片机]
单片机按键&串口控制步进电机正反转调速含程序和仿真
包含程序和仿真 功能:按键或串口发送字符指令,控制步进电机正转、反转、停止、加速、减速动作 仿真过程可直接通过按下电脑键盘控制 仿真原理图如下 单片机源程序如下: #include reg52.h #define uint unsigned int #define uchar unsigned char //------8拍----- uchar code zz ={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //正转 uchar code fz ={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};
[单片机]
单片机<font color='red'>按键</font>&串口控制步进<font color='red'>电机</font>正反转<font color='red'>调速</font>含程序和仿真
STM32直流风机通过按键PWM调速同时各参数在LCD上显示
依然还记得当时学完STM32之后感觉什么都不会,然后基本上是靠单片机的知识撑过期末的测试的,然后其实一直想把STM32学好,但是感觉学太多也不好吧,总感觉这是样,学得多并不是坏事 ,但是总觉得吧,应该要在你学的技能中有一项是你非常突出的。 // //Design:直流电机调速,通过按键改变占空比以达到调速目的,同时显示各参数 //Author:Touch //Time :2017.6.5 // #include led.h #include delay.h #include sys.h #include usart.h #include lcd.h #include key.h #include pwm.h int main(v
[单片机]
基于STM32的直流电机PID调速系统设计与实现
直流调速系统广泛应用于低转速、高精度等各领域,如精密办公设备(喷墨打印机、激光打印机),自动售货机,家用电器、机器人和玩具设备等。其发展得力于微电子技术、电力电子技术、传感器技术、永磁材料技术、自动控制技术和微机应用技术的最新发展成就。顺应调速系统智能化、简单化的发展趋势,本设计采用一款性价比高、功耗低的基于ARMCortex⁃M3内核的STM32单片机为控制核心,结合PID控制技术,实现了直流电机范围大、精度高的调速性能。 1、系统的总体设计 该调速系统能够实现对电机的启动、制动、正反转调速、测速和数据上传等功能,可方便地实现直流电机的四象限运行。本系统的性能指标为:调速精度高达到1r/min;调速稳态误差不超过0.5%;调
[单片机]
基于<font color='red'>STM32</font>的直流<font color='red'>电机</font>PID<font color='red'>调速</font>系统设计与实现
STM32 PWM输出控制步进电机-3000转每分钟串口显示+电位器调速
用电位器控制步进电机转速,可以控制正反转,在电位器中点停止;越往左翻转越快,越往右正转越快。速度均匀,包含滤波。付完整代码。全部测试正常。 单片机源程序: #include led.h #include delay.h #include key.h #include sys.h #include usart.h #include timer.h #include adc.h int main(void) { u16 adcx; float temp; int a=3999; //int b=0 u16 led0pwmval=200; u8
[单片机]
基于L298N的STM32的直流电机PWM调速控制
这两天研究了一下基于L298N与stm32的直流电机调速,实验结果良好,可以根据调节STM32的PWM占空比来进行直流电机的调速。实验系统图如下: 首先整个PWM实验选用的是stm32f103系列,驱动模块选择的是L298N驱动模块,以及12V直流电源。简单的来说,电机调速就是通过stm32输出PWM来进行控制L298N的使能端ENA。 L298N驱动模块 使用方法: 输出A:通道A输出,连接直流电机 输出B:通道B输出,连接电机 12V供电:主电源正极输入 GND:主电源正负极输入 5V输出:5V电压输出端,可用于给STM32开发板进行供电 ENA:通道A使能 ENB:通道B使能 IN1—IN4:逻辑输入IN1-IN
[单片机]
基于L298N的<font color='red'>STM32</font>的直流<font color='red'>电机</font>PWM<font color='red'>调速</font>控制
直流电调速器的最早电路使用
直流电机调速器使用范围多在印刷、纺织、线缆、橡胶等领域。说到直流电机调速器,就要先说说直流电机。 直流电机分为有换向器和无换向器两个大类。直流电调速器是最早使用恒定直流电压的直流电机的电枢电路,通过改变电阻实现速度。 此方法简单,方便,廉价的设备制造;但缺点是效率低,机械特性软,不宽,平滑调速性能。该方法只适用于在一些小的转速和功率要求不大的场合。 在80年代的时候,发电电动机系统速度性能优良的直流电机广泛应用,这种控制方法可以获得很宽的速度范围,而且能够处于一个较小的变化率和平滑的调速性能。但这种方法的主要缺点是系统的重量笨重,效率低和维修困难。 直流电机调速器的工作原理是通过改变输出方波的占空比,使负载上的平均
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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