這是我做的stm32簡易小車前進和后退的代碼
Motor.c文件:
- #include "stm32f10x.h" // Device header
- #include "PWM.h"
- void Motor_Init(void)//直流電機初始化
- {
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//開啟GPIOA時鐘
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//開啟GPIOB時鐘
-
- GPIO_InitTypeDef GPIO_InitStructure;//結構體變量
- GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;//推挽輸出
- GPIO_InitStructure.GPIO_Pin= GPIO_Pin_8| GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;//設置端口
- GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;//輸出速度
- GPIO_Init(GPIOA,&GPIO_InitStructure);//方向控制的初始化
-
- GPIO_InitStructure.GPIO_Pin= GPIO_Pin_12| GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//設置端口
- GPIO_Init(GPIOB,&GPIO_InitStructure);//方向控制的初始化
-
- PWM_Init(); //初始化Pwm模塊 ,控制電機速度
- }
- void Motor_SetSpeed1(int8_t Speed)//速度值:-100~100
- {
- if(Speed>=0)//相對正轉
- {
- GPIO_SetBits(GPIOA,GPIO_Pin_10);//高電平(哪個引腳為高,哪個引腳為低隨意)
- GPIO_ResetBits(GPIOA,GPIO_Pin_11);//低電平(哪個引腳為高,哪個引腳為低隨意)
-
- PWM_SetCompare1(Speed);//單獨更改TIM3通道1的CCR值(PA6)
- }
- else//相對反轉
- {
- GPIO_ResetBits(GPIOA,GPIO_Pin_10);//低電平(哪個引腳為高,哪個引腳為低隨意)
- GPIO_SetBits(GPIOA,GPIO_Pin_11);//高電平(哪個引腳為高,哪個引腳為低隨意)
-
- PWM_SetCompare1(Speed);//單獨更改TIM3通道1的CCR值(PA6)
- }
- }
- void Motor_SetSpeed2(int8_t Speed)//速度值:-100~100
- {
- if(Speed>=0)//相對正轉
- {
- GPIO_SetBits(GPIOA,GPIO_Pin_8);//高電平(哪個引腳為高,哪個引腳為低隨意)
- GPIO_ResetBits(GPIOA,GPIO_Pin_9);//低電平(哪個引腳為高,哪個引腳為低隨意)
-
- PWM_SetCompare2(Speed);//單獨更改TIM3通道2的CCR值(PA7)
- }
- else//相對反轉
- {
- GPIO_ResetBits(GPIOA,GPIO_Pin_8);//低電平(哪個引腳為高,哪個引腳為低隨意)
- GPIO_SetBits(GPIOA,GPIO_Pin_9);//高電平(哪個引腳為高,哪個引腳為低隨意)
-
- PWM_SetCompare2(Speed);//單獨更改TIM3通道2的CCR值(PA7)
- }
- }
- void Motor_SetSpeed3(int8_t Speed)//速度值:-100~100
- {
- if(Speed>=0)//相對正轉
- {
- GPIO_SetBits(GPIOB,GPIO_Pin_14);//高電平(哪個引腳為高,哪個引腳為低隨意)
- GPIO_ResetBits(GPIOB,GPIO_Pin_15);//低電平(哪個引腳為高,哪個引腳為低隨意)
-
- PWM_SetCompare3(Speed);//單獨更改TIM3通道3的CCR值(PB0)
- }
- else//相對反轉
- {
- GPIO_ResetBits(GPIOB,GPIO_Pin_14);//低電平(哪個引腳為高,哪個引腳為低隨意)
- GPIO_SetBits(GPIOB,GPIO_Pin_15);//高電平(哪個引腳為高,哪個引腳為低隨意)
-
- PWM_SetCompare3(Speed);//單獨更改TIM3通道3的CCR值(PB0)
- }
- }
- void Motor_SetSpeed4(int8_t Speed)//速度值:-100~100
- {
- if(Speed>=0)//相對正轉
- {
- GPIO_SetBits(GPIOB,GPIO_Pin_12);//高電平(哪個引腳為高,哪個引腳為低隨意)
- GPIO_ResetBits(GPIOB,GPIO_Pin_13);//低電平(哪個引腳為高,哪個引腳為低隨意)
-
- PWM_SetCompare4(Speed);//單獨更改TIM3通道4的CCR值(PB1)
- }
- else//相對反轉
- {
- GPIO_ResetBits(GPIOB,GPIO_Pin_12);//低電平(哪個引腳為高,哪個引腳為低隨意)
- GPIO_SetBits(GPIOB,GPIO_Pin_13);//高電平(哪個引腳為高,哪個引腳為低隨意)
-
- PWM_SetCompare4(Speed);//單獨更改TIM3通道4的CCR值(PB1)
- }
- }
復制代碼
- #include "stm32f10x.h" // Device header
- #include "Delay.h"
- #include "OLED.h"
- #include "Motor.h"//直流電機
- #include "Key.h"
- #include "LED.h"
- uint8_t KeyNum;//按鍵鍵碼
- uint8_t Mode=0;//模式
- int8_t Speed;//有符號的速度變量
- // 標志位,用于檢測 Key2 是否中斷了 Key1
- //uint8_t Key1_Interrupted = 0;
- int main(void)
- {
- OLED_Init();
- Motor_Init();
- Key_Init();
- LED_Init13();
-
- OLED_ShowString(1,1,"Speed");
- OLED_ShowString(2,1,"Mode");
-
- while(1)
- {
- KeyNum=Key_GetNum();
- if(KeyNum==1) //只用一個按鍵切換模式
- {
- //Key1_Interrupted = 1; // 設置中斷標志
- Mode++;//模式
- Mode%=3;
- }
-
- if(Mode==0)
- {
- Speed=0;
- Motor_SetSpeed1(Speed);//速度
- Motor_SetSpeed2(Speed);//速度
- Motor_SetSpeed3(Speed);//速度
- Motor_SetSpeed4(Speed);//速度
- }
- else if(Mode==1)
- {
- Speed=70;
- LED3_ON();
- Motor_SetSpeed1(Speed);//速度
- Motor_SetSpeed2(Speed);//速度
- Motor_SetSpeed3(Speed);//速度
- Motor_SetSpeed4(Speed);//速度
- }
- else if(Mode==2)
- {
- Speed=-70;
- LED3_OFF();
- Motor_SetSpeed1(Speed);//速度
- Motor_SetSpeed2(Speed);//速度
- Motor_SetSpeed3(Speed);//速度
- Motor_SetSpeed4(Speed);//速度
- }
- OLED_ShowSignedNum(1,7,Speed,3);//顯示有符號的十進制數(shù)字
- OLED_ShowNum(2,7,Mode,1);//顯示無符號的十進制數(shù)字
- }
- }
復制代碼
原理圖: 無
仿真: 無
代碼:
stm32基礎四驅小車-代碼.7z
(183.61 KB, 下載次數(shù): 0)
2025-6-11 03:11 上傳
點擊文件名下載附件
|