標(biāo)題: STM32F103C8T6+L298N直流電機調(diào)速PWM調(diào)速程序與波形圖等資料 [打印本頁]
作者: kzt0992 時間: 2018-11-30 09:25
標(biāo)題: STM32F103C8T6+L298N直流電機調(diào)速PWM調(diào)速程序與波形圖等資料
制作出來的實物圖如下:
實物圖.jpg (1.6 MB, 下載次數(shù): 117)
下載附件
實物圖
2018-11-30 09:24 上傳
(一) 功能說明
用L298N驅(qū)動一臺直流減速電機,引腳IN1,IN2可用于PWM控制。僅用STM32的兩個端口給出PWM信號控制IN1,IN2即可實現(xiàn)正反轉(zhuǎn)、加減速等動作。
(二) 硬件說明:
控制板:STM32F03C8T6最小系統(tǒng);
mcu.jpg (161.15 KB, 下載次數(shù): 113)
下載附件
2018-11-30 09:21 上傳
直流電機驅(qū)動板:L298N是SGS公司的產(chǎn)品,比較常見的是15腳MulTIwatt封裝的L298N,內(nèi)部同樣包含4通道邏輯驅(qū)動電路?梢苑奖愕尿(qū)動兩個直流電機,或一個兩相步進電機。
L298N.jpg (244.42 KB, 下載次數(shù): 117)
下載附件
2018-11-30 09:22 上傳
(三) 資源配置:
STM32F03C8T6使用端口定義 |
| | |
| | |
| | |
| 控制板帶的LED指示燈,周期性的變化,每變化一次,電機的轉(zhuǎn)運方向變化一次。 由TIM3中斷定時控制。 | |
L298N端口定義 |
| | | |
| | | 順時針運轉(zhuǎn),調(diào)整PA2的頻率,可高速。 |
| | | 逆時針運轉(zhuǎn),調(diào)整PA2的頻率,可高速。 |
| | | |
(四) 軟件實現(xiàn)
1:通用定時器TIM3的中斷定時實現(xiàn)步驟
① 使能定時器時鐘。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
② 初始化定時器,配置【ARR自動裝載值,PSC預(yù)分頻系數(shù)。】
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
③ 開啟定時器中斷,配置NVIC。
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
NVIC_Init(&NVIC_InitStructure);
④ 使能定時器。
TIM_Cmd(TIM3,ENABLE); //實際是配置 控制寄存器1 (TIM3_CR1)
⑥ 編寫中斷服務(wù)函數(shù)。
TIMxIRQHandler();
2:通用定時器TIM2的Channel1、Channel2的PWM實現(xiàn)步驟
① 使能定時器2和相關(guān)IO口時鐘。
使能定時器2時鐘:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
使能GPIOB時鐘:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
② 初始化IO口為復(fù)用功能輸出。函數(shù):GPIO_Init();
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF_PP;
③ 初始化定時器:ARR,PSC等:TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
④ 初始化輸出比較參數(shù):
TIM_OC3Init(TIM2,&TIM_OCInitStructure);
TIM_OC4Init(TIM2,&TIM_OCInitStructure);
⑤ 使能預(yù)裝載寄存器:TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
⑥ 使能定時器。TIM_Cmd();
⑦ 不斷改變比較值CCRx,達到不同的占空比效果:TIM_SetCompare3(); TIM_SetCompare4() ;
使用Keil5 模擬軟件的Logic Analyzer功能,PA2,PA3,PC13的波形圖如下所示:
波形圖.jpg (221.2 KB, 下載次數(shù): 113)
下載附件
2018-11-30 09:23 上傳
(五) 附錄:程序源碼
- #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; // 復(fù)用推挽輸出
- 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); //根據(jù)設(shè)定參數(shù)初始化GPIOC.13
- }
- int main(void)
- {
- delay_init(); //延時函數(shù)初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
-
- //每隔5s的周期,變換電機的轉(zhuǎn)向。
- //定時中斷,最小單位鐘頻率=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)
- {
-
- }
- }
復(fù)制代碼
timer.c
- #include "timer.h"
-
- //通用定時器3中斷初始化
- //這里時鐘選擇為APB1的2倍,而APB1為36M
- //arr:自動重裝值。
- //psc:時鐘預(yù)分頻數(shù)
- //這里使用的是定時器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; //設(shè)置在下一個更新事件裝入活動的自動重裝載寄存器周期的值 計數(shù)到5000為500ms
- TIM_TimeBaseStructure.TIM_Prescaler = psc; //設(shè)置用來作為TIMx時鐘頻率除數(shù)的預(yù)分頻值 10Khz的計數(shù)頻率
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時鐘分割:TDTS = Tck_tim
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數(shù)模式
- TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時間基數(shù)單位
-
- TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中斷,允許更新中斷
- NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中斷
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占優(yōu)先級0級
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //從優(yōu)先級3級
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
- NVIC_Init(&NVIC_InitStructure); //根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設(shè)NVIC寄存器
- TIM_Cmd(TIM3, ENABLE); //使能TIMx外設(shè)
- }
- //定時器3中斷服務(wù)程序
- void TIM3_IRQHandler(void) //TIM3中斷
- {
- if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //檢查指定的TIM中斷發(fā)生與否: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波形,分別控制電機的正轉(zhuǎn)與反轉(zhuǎn)
- //PWM輸出初始化
- //arr:自動重裝值
- //psc:時鐘預(yù)分頻數(shù)
- 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; //設(shè)置在下一個更新事件裝入活動的自動重裝載寄存器周期的值
- TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來作為TIMx時鐘頻率除數(shù)的預(yù)分頻值
- TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設(shè)置時鐘分割:TDTS = Tck_tim
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數(shù)模式
- TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時間基數(shù)單位
-
- //初始化TIM2 Channel1 PWM模式
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈沖寬度調(diào)制模式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); //根據(jù)T指定的參數(shù)初始化外設(shè)TIM2 OC4
- TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR2上的預(yù)裝載寄存器
-
- //初始化TIM2 Channel2 PWM模式
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈沖寬度調(diào)制模式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); //根據(jù)T指定的參數(shù)初始化外設(shè)TIM2 OC4
- TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR2上的預(yù)裝載寄存器
-
- TIM_ARRPreloadConfig(TIM2, ENABLE);
- TIM_Cmd(TIM2, ENABLE); //使能TIM2
- }
復(fù)制代碼
0.png (43.65 KB, 下載次數(shù): 122)
下載附件
2018-11-30 14:29 上傳
全部資料51hei下載地址:
STM32F103C8T6核心板+L298N_PWM直流電機調(diào)速.rar
(3.36 MB, 下載次數(shù): 1187)
2018-11-30 14:29 上傳
點擊文件名下載附件
程序
下載積分: 黑幣 -5
作者: yxlei82 時間: 2018-11-30 17:27
謝謝分享,很幫的應(yīng)用!學(xué)習(xí)了!但是程序還是有問題的
作者: jacklee0575 時間: 2019-1-18 13:12
謝謝大佬的分享!多多學(xué)習(xí)
作者: 1831890965 時間: 2019-1-18 16:24
大佬好厲害啊
作者: bluecar 時間: 2019-3-3 09:35
謝謝大佬
作者: 可樂1994 時間: 2019-3-19 21:50
向大佬學(xué)習(xí)了
作者: w1179benp 時間: 2019-3-27 19:09
嘿嘿 ,,,這些硬件手上都有,改天學(xué)著玩玩
作者: SLfass 時間: 2019-4-9 17:04
電池是什么型號的啊?
作者: shuaijin 時間: 2019-5-5 16:25
謝謝分享
作者: xiaozhong1314 時間: 2019-5-27 16:09
謝謝大佬
作者: 永恒圣潔 時間: 2019-7-17 21:48
學(xué)習(xí)學(xué)習(xí) 厲害

作者: xiaozhong1314 時間: 2019-7-22 10:38
學(xué)習(xí)學(xué)習(xí)
作者: xiaozhong1314 時間: 2019-7-23 15:44
這個速度沒有變化啊,只是正反轉(zhuǎn)了
作者: dsvsdsd 時間: 2019-7-24 09:33
你好 想請問一下 減速電機的電壓最大是多少
作者: 木土衛(wèi)康123 時間: 2019-7-29 20:18
請問main函數(shù)中while(1)中怎么沒有控制程序呢?
作者: houyiquan 時間: 2019-7-30 17:26
很感謝,目前正在學(xué)習(xí)
作者: witp 時間: 2019-8-6 17:46
謝謝分享,很幫的應(yīng)用!學(xué)習(xí)了!
作者: 鵬博士PBs 時間: 2019-8-6 20:21
PWM不就是利用高電平調(diào)節(jié)占空比嗎
作者: hanson777 時間: 2019-10-6 17:51
謝謝你的無私奉獻 老哥加油
作者: 563345228 時間: 2019-10-6 20:04
好資料 謝謝大師分享
作者: 樹與葉 時間: 2019-10-12 21:15
樓主辛苦,漲知識了
作者: 愛吃魚的人 時間: 2019-10-27 13:05
這個速度沒有變化啊
作者: 陳大仙 時間: 2019-10-27 14:40
挺好
作者: 愛吃魚的人 時間: 2019-10-28 16:18
為什么速度沒有變化呢
作者: 愛吃魚的人 時間: 2019-10-28 16:30
終于知道為什么不能調(diào)速啦,PWM波需要在程序中修改
作者: shanj4 時間: 2020-3-22 19:36
pc13沒有接線
作者: 1529085120 時間: 2020-7-2 00:39
大佬你好吖,我剛注冊,有一部分調(diào)試不出來,可不可以分享一下吖~謝謝你咯!
作者: kidxpp 時間: 2021-3-10 19:01
很有用的應(yīng)用!學(xué)習(xí)了!
作者: kidxpp 時間: 2021-3-13 13:28
看了 樓主的代碼有點迷茫 請教一下現(xiàn)在是5S 那如果500秒需要改動哪里 時間怎么計算
作者: 派小星 時間: 2021-9-29 15:54
18650就行
作者: chrfjw 時間: 2022-7-22 14:30
謝謝,大佬的無私分享,正在找PWM控制程序呢,
作者: 妙脆啵啵 時間: 2023-6-29 11:44
哥哥,咋實現(xiàn)調(diào)速呀
作者: 太雪 時間: 2023-7-5 10:01
正好需要搞這個,贊
作者: 太雪 時間: 2023-7-5 11:36
為什么我的都不動啊
作者: 靜與放縱 時間: 2023-7-13 17:28
好!向大佬學(xué)習(xí)了
作者: nuonuoa 時間: 2024-5-9 15:39
應(yīng)該都在中斷中控制了
作者: 55556hm 時間: 2024-11-11 20:24
謝謝大佬的分享!多多學(xué)習(xí)..
作者: 6313 時間: 2024-12-8 10:09
頻率多少,能不能驅(qū)動高頻變壓器,同時可以功率調(diào)節(jié)
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |