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

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