戦艦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();
//delay_ms(-1);
}
#motor.c/**
@file Hal_motor.c @author Gizwtis @version V03010100 @date 2016-07-05
@brief機知雲.インテリジェントハードウェアのみのための
*********************************************************/#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;
}
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;
}//タイマ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;
//このピンを多重出力機能に設定、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の時間ベース単位を初期化します.
//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にプリマウントできるようにする
}
#実験結果はモータの正反転と変速を実現できる
#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/**
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
}
#実験結果はモータの正反転と変速を実現できる