stm32通过电调带动电机(可按键调速)
来源:互联网 发布:mysql显示当前时间指令 编辑:程序博客网 时间:2024/04/28 01:46
这几天在做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/给单片机写程序:使得某引脚输出500Hz的PWM信号,初始化时高电平时间设置为1.9ms, 然后在while循环里面加入检测按键的程序,当按键按下,把高电平设置为0.7ms。 2/1.给单片机写程序,把刚才的PWM初始化的高电平设置为0.7ms,保证刚上电,电调不会让电机转动。 然后给修改按键按下的程序,修改为,按一次按键,高电平时间增加一点点,最大增加到1.9ms。 我的按键再c13(k2)和e0(k1) 日期:2016.3.4***************************************************************************************/#include "dianji.h" uint8_t indexWave[] = {5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}; //占空比表 //声明函数void Tim2_init(void);void Motor_Init(void);void Init_NVIC(void);void Delay_Ms(uint16_t time); void Delay_Us(uint16_t time); void Init_TI_KEY(void); int main(void){ SystemInit(); //系统时钟配置 Motor_Init(); Tim2_init(); Init_NVIC(); //中断向量表注册函数 Init_TI_KEY(); //按键引脚中断初始化 while(1); }void Tim2_init(void){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseStructure.TIM_Period = 20-1; //设置ARR的值为19,从0计数到19,刚好是2ms ,500hz TIM_TimeBaseStructure.TIM_Prescaler = 7200-1;//设置PSC的值为7199,这样的话每计数一次为0.1ms TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMx向上计数模式 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseStructure中指定的参数初始化外设TIM2 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值,刚开始可以设置为0. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高 TIM_OC1Init(TIM2, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR1上的预装载寄存器 TIM_ARRPreloadConfig(TIM2, ENABLE); //使能TIM2在ARR上的预装载寄存器 TIM_Cmd(TIM2, ENABLE); //使能TIM2外设}/******************************************************************************函数原型: void Motor_Init(void)功 能: PWM初始化*******************************************************************************/ void Motor_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能电机用的时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ; //设置电机使用到得管脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure);}/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::** 函数名称: KEY_TI_Init** 功能描述: 按键 中断配置 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/void Init_TI_KEY(void){ EXTI_InitTypeDef EXTI_InitStructure; //定义一个EXTI结构体变量 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能IO复用功能,使用中断功能重要!!! GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);//配置端口C的13引脚为中断源 重要!! 板上标号INT2 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource0); //配置端口E的0引脚为中断源 重要!! 板上标号INT1 EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line13;// EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式为中断模式 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿出发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中断线 EXTI_Init(&EXTI_InitStructure); //根据参数初始化中断寄存器}/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::** 函数名称: Init_NVIC** 功能描述: 系统中断配置:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/void Init_NVIC(void){ NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组2 NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //设定中断源为PC13 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //中断占优先级为2 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //副优先级为0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断 NVIC_Init(&NVIC_InitStructure); //根据参数初始化中断寄存器 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //设定中断源为PE0 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //中断占优先级为1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //副优先级为0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断 NVIC_Init(&NVIC_InitStructure); //根据参数初始化中断寄存器}/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::** 函数名称: EXTI15_10_IRQHandler** 功能描述: 中断15_10入口函数 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/void EXTI15_10_IRQHandler(void) //占空比减小{ static uint8_t pwm_index = 0; //用于PWM查表 static uint8_t period_cnt = 0; //用于计算周期数 //就是上面两个静态变量没有设置 ,导致一开始按键只能按一次,在往下按他的pwm表就不往下查表了,我想了一晚上啊。 //今天早晨我突然发现可能是这两个静态变量没有设置,一试,果然。开心至极。2016.3.5 if(EXTI_GetITStatus(EXTI_Line13)!= RESET) //判断是否发生中断,发生则中断标志置1 { Delay_Ms(5); //消抖 period_cnt++; TIM2->CCR1 = indexWave[pwm_index]; //根据PWM表修改定时器的比较寄存器值 pwm_index++; //标志PWM表的下一个元素 if( pwm_index >= 15) //若PWM脉冲表已经输出完成一遍,重置PWM查表标志 { pwm_index=0; } //TIM_ClearITPendingBit (TIM2, TIM_IT_Update); //必须要清除中断标志位 EXTI_ClearITPendingBit(EXTI_Line13); //清楚中断挂起位,重要!! } }/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::** 函数名称: EXTI0_IRQHandler** 功能描述: 中断0入口函数 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/void EXTI0_IRQHandler(void) //占空比增大{ if(EXTI_GetITStatus(EXTI_Line0)!= RESET) //判断是否发生中断,发生则中断标志置1 { Delay_Ms(5); //暂时不用 } EXTI_ClearITPendingBit(EXTI_Line0); //清楚中断挂起位,重要!! }/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::** 函数名称: Delay_Ms_Ms** 功能描述: 延时1MS (可通过仿真来判断他的准确度) ** 参数描述:time (ms) 注意time<65535:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/void Delay_Ms(uint16_t time) //延时函数{ uint16_t i,j; for(i=0;i<time;i++) for(j=0;j<10260;j++);}/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::** 函数名称: Delay_Ms_Us** 功能描述: 延时1us (可通过仿真来判断他的准确度)** 参数描述:time (us) 注意time<65535 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/void Delay_Us(uint16_t time) //延时函数{ uint16_t i,j; for(i=0;i<time;i++) for(j=0;j<9;j++);}/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::End:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
就是以上这些,有问题欢迎讨论。
2 0
- stm32通过电调带动电机(可按键调速)
- stm32通过电调带动电机(可按键调速)
- stm32----通过电调控制无刷电机
- 电机调速详解
- 交流电机怎么样无级调速???
- 555简易电机调速电路
- 【STM32小案例 06 】STM32使用按键驱动L298N电机模块控制电机正反转
- STM32 FOC SDK 上电电机自动旋转
- 基于stm32的遥控小船(三)PWM调速
- 利用51单片机按键设置ztw电调(修改3,验证OK,可以控制电机5级转速了)+mpu6050
- 基于AVR单片机的电机调速
- 可控硅及其应用 -- 功率调节、电机调速
- 如何使用单片机通过电调控制无刷电机
- 文本滚动处理可调速
- 可调速自动播放ppt
- 【STM32】STM32之DRV8834电机驱动(IO方式)
- 【STM32】STM32之DRV8834电机驱动(PWM方式)
- STM32之中断(按键)
- an out of memory error has occurred.Consult the 'running eclipse' section of the read me file for...
- C语言中enum枚举类型
- Deep Learning for Nature Language Processing --- 第八讲
- Java图的遍历(深度优先遍历、广度优先遍历)
- 句子相似度
- stm32通过电调带动电机(可按键调速)
- 排序总结(1)---冒泡排序、选择排序、插入排序、希尔排序
- 《使用Python进行自然语言处理》学习笔记一
- 嵌入式开发中volatile关键词使用场景
- iOS image 解压
- 2017年5月5日,周结(十一),android第一行代码深度探索
- MySQL(1)-对表及数据的基本操作
- matplotlib的基本用法(十六)——创建动画
- form表单中name和id的区别