制作出來的實物圖如下:
實物圖
(一) 功能說明 用L298N驅動一臺直流減速電機,引腳IN1,IN2可用于PWM控制。僅用STM32的兩個端口給出PWM信號控制IN1,IN2即可實現正反轉、加減速等動作。 (二) 硬件說明: 控制板:STM32F03C8T6最小系統;
直流電機驅動板:L298N是SGS公司的產品,比較常見的是15腳MulTIwatt封裝的L298N,內部同樣包含4通道邏輯驅動電路。可以方便的驅動兩個直流電機,或一個兩相步進電機。
(三) 資源配置: STM32F03C8T6使用端口定義 | | | | | | | | | | | 控制板帶的LED指示燈,周期性的變化,每變化一次,電機的轉運方向變化一次。 由TIM3中斷定時控制。 | |
(四) 軟件實現 1:通用定時器TIM3的中斷定時實現步驟 ① 使能定時器時鐘。 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); ② 初始化定時器,配置【ARR自動裝載值,PSC預分頻系數。】 TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); ③ 開啟定時器中斷,配置NVIC。 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); NVIC_Init(&NVIC_InitStructure); ④ 使能定時器。 TIM_Cmd(TIM3,ENABLE); //實際是配置 控制寄存器1 (TIM3_CR1) ⑥ 編寫中斷服務函數。 TIMxIRQHandler(); 2:通用定時器TIM2的Channel1、Channel2的PWM實現步驟 ① 使能定時器2和相關IO口時鐘。 使能定時器2時鐘:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); 使能GPIOB時鐘:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); ② 初始化IO口為復用功能輸出。函數:GPIO_Init(); GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF_PP; ③ 初始化定時器:ARR,PSC等:TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure); ④ 初始化輸出比較參數: TIM_OC3Init(TIM2,&TIM_OCInitStructure); TIM_OC4Init(TIM2,&TIM_OCInitStructure); ⑤ 使能預裝載寄存器:TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); ⑥ 使能定時器。TIM_Cmd(); ⑦ 不斷改變比較值CCRx,達到不同的占空比效果:TIM_SetCompare3(); TIM_SetCompare4() ; 使用Keil5 模擬軟件的Logic Analyzer功能,PA2,PA3,PC13的波形圖如下所示:
(五) 附錄:程序源碼
- #include "delay.h"
- #include "sys.h"
- #include "timer.h"
- void GPIO_Config(void) //配置PA2, PA3
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- /* GPIOA clock enable */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC,ENABLE); //
-
- /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 復用推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //LED0-->PC.13 端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
- GPIO_Init(GPIOC, &GPIO_InitStructure); //根據設定參數初始化GPIOC.13
- }
- int main(void)
- {
- delay_init(); //延時函數初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
-
- //每隔5s的周期,變換電機的轉向。
- //定時中斷,最小單位鐘頻率=72MHz/36KHz=2KHz
- TIM3_Int_Init(9999,35999) ;
-
- GPIO_Config(); //LED,PWM端口初始化,配置PC13,PA2,PA3
- TIM2_PWM_Init(47999,2 ); //分頻。最小單位鐘頻率=72000000/(2+1)=24Mhz
- while(1)
- {
-
- }
- }
復制代碼
timer.c
- #include "timer.h"
-
- //通用定時器3中斷初始化
- //這里時鐘選擇為APB1的2倍,而APB1為36M
- //arr:自動重裝值。
- //psc:時鐘預分頻數
- //這里使用的是定時器3!
- #define PC13 PCout(13)// PC13
- void TIM3_Int_Init(u16 arr,u16 psc)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //時鐘使能
- // RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ,ENABLE );
- // GPIO_PinRemapConfig(GPIO_FullRemap_TIM3 ,ENABLE);
-
- TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值 計數到5000為500ms
- TIM_TimeBaseStructure.TIM_Prescaler = psc; //設置用來作為TIMx時鐘頻率除數的預分頻值 10Khz的計數頻率
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設置時鐘分割: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 TIM3_IRQHandler(void) //TIM3中斷
- {
- if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //檢查指定的TIM中斷發生與否:TIM 中斷源
- {
- TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中斷待處理位:TIM 中斷源
- PC13=!PC13;
-
- if (PC13 ==1)
- {
- TIM_SetCompare3(TIM2,24000);
- TIM_SetCompare4(TIM2,0);
- }
- else
- {
- TIM_SetCompare3(TIM2,0);
- TIM_SetCompare4(TIM2,24000);
- }
- }
- }
- //TIM2 PWM部分初始化 兩個PWM波形,分別控制電機的正轉與反轉
- //PWM輸出初始化
- //arr:自動重裝值
- //psc:時鐘預分頻數
- void TIM2_PWM_Init(u16 arr,u16 psc)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定時器3時鐘
-
- //初始化TIM2
- 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(TIM2, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位
-
- //初始化TIM2 Channel1 PWM模式
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈沖寬度調制模式2
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
- TIM_OCInitStructure.TIM_Pulse = 13500 ;
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
- TIM_OC3Init(TIM2, &TIM_OCInitStructure); //根據T指定的參數初始化外設TIM2 OC4
- TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR2上的預裝載寄存器
-
- //初始化TIM2 Channel2 PWM模式
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈沖寬度調制模式2
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
- TIM_OCInitStructure.TIM_Pulse = 0;
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
- TIM_OC4Init(TIM2, &TIM_OCInitStructure); //根據T指定的參數初始化外設TIM2 OC4
- TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR2上的預裝載寄存器
-
- TIM_ARRPreloadConfig(TIM2, ENABLE);
- TIM_Cmd(TIM2, ENABLE); //使能TIM2
- }
復制代碼
全部資料51hei下載地址:
STM32F103C8T6核心板+L298N_PWM直流電機調速.rar
(3.36 MB, 下載次數: 1187)
2018-11-30 14:29 上傳
點擊文件名下載附件
程序
|