這幾天在做32通過電調(diào)帶動電機的實驗,上網(wǎng)一查,發(fā)現(xiàn)這方面的資料很少,經(jīng)過自己的親自實踐,總結(jié)出以下經(jīng)驗,供大家參考。
論壇上也有很多人說自己在做,但是都遇到了同樣的瓶頸。我想他們大多是pwm的頻率和占空比沒有調(diào)到合適的值吧。
首先,我在網(wǎng)上只找到一片很好的文章,是瑞生大神寫的:http://www.rationmcu.com/lpc1114/1126.html
我的電機是銀燕2212/1400kv經(jīng)典電機 ,電調(diào)也是銀燕40A無刷電調(diào)。
通過它知道,當pwm設(shè)置為500hz的 時候電調(diào)才能正常的工作,剛開始時高電平時間要控制在0.7-1.9左右,讓電機帶電自檢。
通過按鍵控制占空比可以很好地 實現(xiàn)這一點。
好了,下面上我的代碼。
先來頭文件吧
#ifndef_Motor_H_
#define_Motor_H_
#include"stm32f10x.h"
/******************************************************************************
全局函數(shù)聲明
*******************************************************************************/
voidMotor_Init(void);
//voidMotor_Out(int16_tduty1,int16_tduty2,int16_tduty3,int16_tduty4);
#endif
主菜:
/***************************************************************************************
1/給單片機寫程序:使得某引腳輸出500Hz的PWM信號,初始化時高電平時間設(shè)置為1.9ms,
然后在while循環(huán)里面加入檢測按鍵的程序,當按鍵按下,把高電平設(shè)置為0.7ms。
2/1.給單片機寫程序,把剛才的PWM初始化的高電平設(shè)置為0.7ms,保證剛上電,電調(diào)不會讓電機轉(zhuǎn)動。
然后給修改按鍵按下的程序,修改為,按一次按鍵,高電平時間增加一點點,最大增加到1.9ms。
我的按鍵再c13(k2)和e0(k1)
日期:2016.3.4
***************************************************************************************/
#include"dianji.h"
uint8_tindexWave[]={5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};//占空比表
//聲明函數(shù)
voidTim2_init(void);
voidMotor_Init(void);
voidInit_NVIC(void);
voidDelay_Ms(uint16_ttime);
voidDelay_Us(uint16_ttime);
voidInit_TI_KEY(void);
intmain(void)
{
SystemInit();//系統(tǒng)時鐘配置
Motor_Init();
Tim2_init();
Init_NVIC();//中斷向量表注冊函數(shù)
Init_TI_KEY();//按鍵引腳中斷初始化
while(1);
}
voidTim2_init(void)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
TIM_OCInitTypeDefTIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_TimeBaseStructure.TIM_Period=20-1;//設(shè)置ARR的值為19,從0計數(shù)到19,剛好是2ms,500hz
TIM_TimeBaseStructure.TIM_Prescaler=7200-1;//設(shè)置PSC的值為7199,這樣的話每計數(shù)一次為0.1ms
TIM_TimeBaseStructure.TIM_ClockDivision=0;//設(shè)置時鐘分割:TDTS=Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//TIMx向上計數(shù)模式
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//根據(jù)TIM_TimeBaseStructure中指定的參數(shù)初始化外設(shè)TIM2
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//選擇定時器模式
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//比較輸出使能
TIM_OCInitStructure.TIM_Pulse=0;//設(shè)置待裝入捕獲比較寄存器的脈沖值,剛開始可以設(shè)置為0.
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//輸出極性:TIM輸出比較極性高
TIM_OC1Init(TIM2,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);//使能TIM2在CCR1上的預(yù)裝載寄存器
TIM_ARRPreloadConfig(TIM2,ENABLE);//使能TIM2在ARR上的預(yù)裝載寄存器
TIM_Cmd(TIM2,ENABLE);//使能TIM2外設(shè)
}
/******************************************************************************
函數(shù)原型:voidMotor_Init(void)
功能:PWM初始化
*******************************************************************************/
voidMotor_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能電機用的時鐘
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//設(shè)置電機使用到得管腳
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
**函數(shù)名稱:KEY_TI_Init
**功能描述:按鍵中斷配置
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
voidInit_TI_KEY(void)
{
EXTI_InitTypeDefEXTI_InitStructure;//定義一個EXTI結(jié)構(gòu)體變量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能IO復(fù)用功能,使用中斷功能重要?。。?/p>
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource13);//配置端口C的13引腳為中斷源重要?。“迳蠘颂朓NT2
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource0);//配置端口E的0引腳為中斷源重要?。“迳蠘颂朓NT1
EXTI_InitStructure.EXTI_Line=EXTI_Line0|EXTI_Line13;//
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//中斷模式為中斷模式
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//下降沿出發(fā)
EXTI_InitStructure.EXTI_LineCmd=ENABLE;//使能中斷線
EXTI_Init(&EXTI_InitStructure);//根據(jù)參數(shù)初始化中斷寄存器
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
**函數(shù)名稱:Init_NVIC
**功能描述:系統(tǒng)中斷配置
::::::