历史上的今天
返回首页

历史上的今天

今天是:2025年01月07日(星期二)

正在发生

2020年01月07日 | stm32通过电调带动电机(可按键调速)

2020-01-07 来源:eefocus

这几天在做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             

推荐阅读

史海拾趣

Cableform Inc公司的发展小趣事

随着技术的不断进步和市场的扩大,Cableform Inc公司意识到必须走出国门,开拓更广阔的市场。1974年,公司在弗吉尼亚州特洛伊成立了北美业务分部,这是公司国际化战略的重要一步。在北美市场,公司面临着激烈的竞争和不同的文化背景,但凭借着优质的产品和服务,Cableform Inc逐渐赢得了客户的信任,市场份额稳步上升。

Bytes公司的发展小趣事

在发展过程中,Bytes公司注重与其他企业和机构的合作。公司与多家知名企业建立了战略合作关系,共同开发新产品、拓展新市场。同时,公司还积极参与行业组织和协会的活动,推动行业标准的制定和实施。通过合作与共赢的方式,Bytes公司实现了资源共享、优势互补,进一步提升了自身的竞争力和影响力。

Ecera Comtek Corp公司的发展小趣事

随着公司实力的不断增强,Ecera Comtek Corp公司开始寻求更广阔的发展空间。公司决定进军国际市场,拓展海外业务。然而,国际市场的竞争更加激烈,Ecera Comtek Corp公司面临着来自全球各地的强大竞争对手。为了应对这一挑战,Ecera Comtek Corp公司加强了与国际合作伙伴的联系,共同研发新产品,开拓新市场。同时,公司还加大了对海外市场的宣传力度,提高了品牌的知名度和美誉度。经过几年的努力,Ecera Comtek Corp公司的产品逐渐在国际市场上获得了认可,海外业务也取得了显著的进展。

GSME Electronics公司的发展小趣事

在半导体行业,技术创新是企业持续发展的关键。GSME Electronics深知这一点,不断加大研发投入,提升公司的研发实力。公司拥有一支朝气蓬勃的高素质员工团队,他们致力于新产品的开发和旧产品的升级换代。通过不断的技术创新和研发努力,GSME Electronics在半导体器件领域取得了多项技术突破,为公司的发展注入了新的动力。

FIDELIX公司的发展小趣事

在东芯半导体的支持下,FIDELIX开始将其一部分技术团队迁移到国内,加速了存储芯片的国产替代进程。这些技术团队的加入,不仅提升了国内半导体产业的技术水平,也促进了FIDELIX与国内企业的深度融合和协同发展。

博流(Bouffalo Lab)公司的发展小趣事

博流智能科技始创于2016年,由一群来自硅谷顶级芯片公司的创始团队组成。他们凭借在移动通讯及物联网技术领域的深厚积累,以及对未来科技趋势的敏锐洞察,决定投身于新一代物联网集成电路芯片的研发。初创时期,公司面临着资金、技术和市场等多重挑战,但团队凭借坚定的信念和不懈的努力,逐步克服了困难,为公司的长远发展奠定了坚实基础。

问答坊 | AI 解惑

LPC2000应用笔记

免费资料,内容很齐全哦 [ 本帖最后由 jxb01033016 于 2009-9-17 11:36 编辑 ]…

查看全部问答>

我可以解决芯片的焊接问题

我可以焊接芯片CP2102,我觉得是件很容易的事,如果谁需要焊接,我很乐意帮忙。我的QQ;724791682       724791682@qq.com…

查看全部问答>

有关jlink

想玩一玩S3C2440, 请问: 1. 一定需要jlink或ulink吗? 2.看网上卖jlink从100元至1200元不等,真正功能上有区别么? 谢了 …

查看全部问答>

RAW格式转换为NTFS

请教: 如何将RAW格式转换为NTFS格式的? …

查看全部问答>

DMA传输数据的问题

DMA传输数据64K时,目的空间每包前一部分(4K左右)是后一包的数据,后一部分是前一包的数据(60K), 比如我第i包全是2,第i+1全是3,我看到的第i+1数据如下(很有规律): 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 ...…

查看全部问答>

变频器的正常使用及故障维修

一、正确使用变频器应注意事项 1、环境温度对变频器的使用寿命有很大的影响。环境温度每升10℃,则变频器寿命减半,所以周围环境温度及变频器散热的问题一定要解决好。 2、正确的接线及参数设置。在安装变频器之前一定要熟读其手册,掌握其用法、 ...…

查看全部问答>

大家来谈谈喜欢玩单片机还是ARM!~

我相信大家都是应该先玩完单片机以后开始玩ARM的吧!~我也是这样的,但是为什么突然觉得还是单片机好玩一些,我想了一下,是因为单片机简单?不是,是因为它价格低?我不做产品,所以无所谓呀,但是就是感觉自己还是喜欢玩单片机一些,坛友们你们也 ...…

查看全部问答>

STM8L做FFT可行不?

                                 请问香水板主,有没有人用STM8L做256点,16位整形的 FFT计算,大概要多长时间?…

查看全部问答>

选型前咨询:STM8敢上吗?

现在又回到8位机做一个低成本的东东,STM8敢选吗? 有使用经历的朋友诚恳介绍下吧! 谢谢了!…

查看全部问答>

pi闭环控制技术

pi闭环控制技术是什么技术呀?它的原理是什么呀?我在网上收索了pi,但相关资源太少了。我还是不懂。所以就到了论坛里问问。…

查看全部问答>