戦艦STM 32制御L 9110モータ駆動

6108 ワード

#STM 32制御L 9110モータ駆動モジュール#標準ライブラリを使用#材料が必要(他のSTM 32開発ボードでも可、ハードウェア回路図に照らして駆動変更可)1.戦艦V 3 2.L 9110モータ駆動モジュール
#main.c#include“stm 32 f 10 x.h”//公式ライブラリ#include“stm 32 f 10 x_gpio.h”#include“stm 32 f 10 x_rcc.h”
#include “motor.h” #include “delay.h” #include “key.h” #include “timer.h”
int main(void){vu 8 key=0;u 8 dir=1;u 16 pwm=0;delay_init();//遅延関数初期化delay_ms(1000);KEY_Init();//キー初期化//TIM 3_Int_Init(97199);TIM 3_PWM_Init(899,0);motorInit();
while(1)
{
    key=KEY_Scan(0);	//    
   	if(key)
	{						   
		switch(key)
		{				 
			case WKUP_PRES:	  
				             	motorStatus(0); //  
		                  delay_ms(1); 
				break; 
			
			case KEY1_PRES:	  
				             motorStatus(-1);  //

//delay_ms(-1);
				break;
			case KEY0_PRES:   
                      motorStatus(-5); 

			break;
		}
	}else delay_ms(10); 
}

}
#motor.c/**

  • @file Hal_motor.c
  • @author Gizwtis
  • @version V03010100
  • @date 2016-07-05

  • @brief機知雲.インテリジェントハードウェアのみのための
  •        Gizwits Smart Cloud  for Smart Products
    
  •          |  ?|  |  |  |  |  |  
    
  •        www.gizwits.com
    


  • *********************************************************/#include #include “motor.h” #include “stdlib.h”
    void motorInit(void) {//tim3GpioConfig();//tim3ModeConfig(); motorStatus(0); }
    void motorControl(uint8_t m1,uint8_t m2) { u16 temp = (MOTOR_ARR+1)/MOTOR_MAX;
    TIM_SetCompare1(TIM3,m1*temp);	//m1
    TIM_SetCompare2(TIM3,m2*temp);	//m4
    

    }
    void motorStatus(motor_t status) { if(0 == status) { motorControl(0,0); } else { if(status > 0) {//GPIO_ResetBits(GPIOC,GPIO_Pin_7); motorControl((abs(status)+5)*10, 0); } else { motorControl(0, (abs(status)+2)*10); } } } #motor.h #ifndef MOTOR_H #define MOTOR_H
    #include #include “stm32f10x_gpio.h”
    #define Motor_stop 0 #define Motor_Forward 1 #define Motor_Reverse 2
    #define MOT1 PBout(8) #define MOT2 PBout(9)
    #define MOTOR_ARR 899//8kHZ #define MOTOR_MAX 100 #define MOTOR_MAX1 -100 #define MOTOR_MIN 0
    #ifdef MOTOR_16 typedef int16_t motor_t; #else typedef int8_t motor_t; #endif
    void motorInit(void); void motorStatus(motor_t status);
    #endif/_HAL_MOTOR_H/
    #timer.c#include"timer.h"#include"led.h"#include"usart.h"//本プログラムは学習用のみで、著者の許可を得ずに、他のいかなる用途にも使用できない//ALIENTEK//技術フォーラム:www.openedv.com//修正日:2012/9/4//バージョン:V 1.1//版権所有、海賊版必究.//Copyright© 広州市星翼電子科技有限公司2009-2019//ALL rights reserved//************************************************************//V 1.1 20120904//1、TIM 3_を追加PWM_Init関数.//2、LED 0_を追加PWM_VALマクロ定義、制御TIM 3_CH 2脈幅//
    //汎用タイマ3割り込み初期化//ここでクロックはAPB 1の2倍、APB 1は36 M//arr:自動リロード値を選択します.//psc:クロックプリディビジョン周波数//ここではタイマー3を使用しています!void TIM3_Int_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //    
    
    TIM_TimeBaseStructure.TIM_Period = arr; //                           	    5000 500ms
    TIM_TimeBaseStructure.TIM_Prescaler =psc; //      TIMx             10Khz       
    TIM_TimeBaseStructure.TIM_ClockDivision = 0; //      :TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM      
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //  TIM_TimeBaseInitStruct         TIMx       
    
    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //     TIM3  ,      
    
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3  
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //     0 
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //    3 
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ     
    NVIC_Init(&NVIC_InitStructure);  //  NVIC_InitStruct           NVIC   
    
    TIM_Cmd(TIM3, ENABLE);  //  TIMx  
    

    }//タイマ3割り込みサービスプログラムvoid TIM 3_IRQHandler(void)/IM 3割込み{if(TIM_GetITStatus(TIM 3,TIM_IT_Update)!=RESET)/指定されたTIM割込み発生の有無をチェック:TIM割込みソース{TIM_ClearitPendingBit(TIM 3,TIM_IT_Update);//TIMxの割込み待ち処理ビットをクリア:TIM割込みソースLED 1=!LED 1;}
    //TIM 3 PWM部分初期化//PWM出力初期化//arr:自動リロード値//psc:クロックプリディビジョン周波数void TIM 3_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);	//     3  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC  | RCC_APB2Periph_AFIO, ENABLE);  //  GPIO   AFIO        
    
    GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); //Timer3     TIM3_CH2->PB5    
    

    //このピンを多重出力機能に設定、TIM 3 CH 2のPWMパルス波形GPIOBを出力する.5 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;//TIM_CH2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//多重プッシュプル出力GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure);//GPIOの初期化
    //TIM 3 TIM_を初期化するTimeBaseStructure.TIM_Period = arr;//次の更新イベント読み込みアクティビティの自動リロードレジスタサイクルの値TIM_を設定TimeBaseStructure.TIM_Prescaler =psc;//TIMxクロック周波数除数用のプリスプリット値TIM_を設定TimeBaseStructure.TIM_ClockDivision = 0;//クロック分割の設定:TDTS=Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIMアップカウントモードTIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);//TIM_によるとTimeBaseInitStructで指定したパラメータは、TIMxの時間ベース単位を初期化します.
    //   TIM3 Channel2 PWM  	 
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //       :TIM        2
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //      
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //    :TIM       
    TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //  T          TIM3 OC2
    

    //TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);//TIM 3をCCR 2にプリマウントできるようにする
    TIM_Cmd(TIM3, ENABLE);  //  TIM3
    

    }
    #実験結果はモータの正反転と変速を実現できる