這幾天在做32通過(guò)電調(diào)帶動(dòng)電機(jī)的實(shí)驗(yàn),上網(wǎng)一查,發(fā)現(xiàn)這方面的資料很少,經(jīng)過(guò)自己的親自實(shí)踐,總結(jié)出以下經(jīng)驗(yàn),供大家參考。
論壇上也有很多人說(shuō)自己在做,但是都遇到了同樣的瓶頸。我想他們大多是pwm的頻率和占空比沒(méi)有調(diào)到合適的值吧。
首先,我在網(wǎng)上只找到一片很好的文章,是瑞生大神寫(xiě)的:http://www.rationmcu.com/lpc1114/1126.html
我的電機(jī)是銀燕2212/1400kv經(jīng)典電機(jī) ,電調(diào)也是銀燕40A無(wú)刷電調(diào)。
通過(guò)它知道,當(dāng)pwm設(shè)置為500hz的 時(shí)候電調(diào)才能正常的工作,剛開(kāi)始時(shí)高電平時(shí)間要控制在0.7-1.9左右,讓電機(jī)帶電自檢。
通過(guò)按鍵控制占空比可以很好地 實(shí)現(xiàn)這一點(diǎn)。
好了,下面上我的代碼。
先來(lái)頭文件吧
#ifndef _Motor_H_
#define _Motor_H_
#include "stm32f10x.h"
/******************************************************************************
全局函數(shù)聲明
*******************************************************************************/
void Motor_Init(void);
//void Motor_Out(int16_t duty1,int16_t duty2,int16_t duty3,int16_t duty4);
#endif
主菜:
1 /***************************************************************************************
2 1/給單片機(jī)寫(xiě)程序:使得某引腳輸出500Hz的PWM信號(hào),初始化時(shí)高電平時(shí)間設(shè)置為1.9ms,
3 然后在while循環(huán)里面加入檢測(cè)按鍵的程序,當(dāng)按鍵按下,把高電平設(shè)置為0.7ms。
4 2/1.給單片機(jī)寫(xiě)程序,把剛才的PWM初始化的高電平設(shè)置為0.7ms,保證剛上電,電調(diào)不會(huì)讓電機(jī)轉(zhuǎn)動(dòng)。
5 然后給修改按鍵按下的程序,修改為,按一次按鍵,高電平時(shí)間增加一點(diǎn)點(diǎn),最大增加到1.9ms。
6
7 我的按鍵再c13(k2)和e0(k1)
8 日期:2016.3.4
9 ***************************************************************************************/
10
11 #include "dianji.h"
12
13 uint8_t indexWave[] = {5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}; //占空比表
14
15 //聲明函數(shù)
16 void Tim2_init(void);
17 void Motor_Init(void);
18 void Init_NVIC(void);
19 void Delay_Ms(uint16_t time);
20 void Delay_Us(uint16_t time);
21 void Init_TI_KEY(void);
22
23
24 int main(void)
25 {
26
27 SystemInit(); //系統(tǒng)時(shí)鐘配置
28 Motor_Init();
29 Tim2_init();
30 Init_NVIC(); //中斷向量表注冊(cè)函數(shù)
31 Init_TI_KEY(); //按鍵引腳中斷初始化
32
33 while(1);
34
35 }
36
37
38 void Tim2_init(void)
39 {
40
41 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
42 TIM_OCInitTypeDef TIM_OCInitStructure;
43
44 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
45
46 TIM_TimeBaseStructure.TIM_Period = 20-1; //設(shè)置ARR的值為19,從0計(jì)數(shù)到19,剛好是2ms ,500hz
47 TIM_TimeBaseStructure.TIM_Prescaler = 7200-1;//設(shè)置PSC的值為7199,這樣的話(huà)每計(jì)數(shù)一次為0.1ms
48
49
50 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設(shè)置時(shí)鐘分割:TDTS = Tck_tim
51 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMx向上計(jì)數(shù)模式
52 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseStructure中指定的參數(shù)初始化外設(shè)TIM2
53
54 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時(shí)器模式
55 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
56
57 TIM_OCInitStructure.TIM_Pulse = 0; //設(shè)置待裝入捕獲比較寄存器的脈沖值,剛開(kāi)始可以設(shè)置為0.
58 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
59
60 TIM_OC1Init(TIM2, &TIM_OCInitStructure);
61 TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR1上的預(yù)裝載寄存器
62
63 TIM_ARRPreloadConfig(TIM2, ENABLE); //使能TIM2在ARR上的預(yù)裝載寄存器
64 TIM_Cmd(TIM2, ENABLE); //使能TIM2外設(shè)
65 }
66
67 /******************************************************************************
68 函數(shù)原型: void Motor_Init(void)
69 功 能: PWM初始化
70 *******************************************************************************/
71 void Motor_Init(void)
72 {
73
74 GPIO_InitTypeDef GPIO_InitStructure;
75
76 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能電機(jī)用的時(shí)鐘
77
78 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ; //設(shè)置電機(jī)使用到得管腳
79 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
80 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
81 GPIO_Init(GPIOA, &GPIO_InitStructure);
82
83 }
84
85 /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
86 ** 函數(shù)名稱(chēng): KEY_TI_Init
87 ** 功能描述: 按鍵 中斷配置
88 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
89 void Init_TI_KEY(void)
90 {
91 EXTI_InitTypeDef EXTI_InitStructure; //定義一個(gè)EXTI結(jié)構(gòu)體變量
92
93 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能IO復(fù)用功能,使用中斷功能重要!!!
94
95 GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);//配置端口C的13引腳為中斷源 重要!! 板上標(biāo)號(hào)INT2
96 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource0); //配置端口E的0引腳為中斷源 重要!! 板上標(biāo)號(hào)INT1
97 EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line13;//
98 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中斷模式為中斷模式
99 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿出發(fā)
100 EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中斷線
101 EXTI_Init(&EXTI_InitStructure); //根據(jù)參數(shù)初始化中斷寄存器
102 }
103
104 /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
105 ** 函數(shù)名稱(chēng): Init_NVIC
106 ** 功能描述: 系統(tǒng)中斷配置
107
108 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
109 void Init_NVIC(void)
110 {
111 NVIC_InitTypeDef NVIC_InitStructure;
112
113 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置中斷優(yōu)先級(jí)分組2
114
115 NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //設(shè)定中斷源為PC13
116 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //中斷占優(yōu)先級(jí)為2
117 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //副優(yōu)先級(jí)為0
118 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中斷
119 NVIC_Init(&NVIC_InitStructure); //根據(jù)參數(shù)初始化中斷寄存器
120
121 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //設(shè)定中斷源為PE0
122 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //中斷占優(yōu)先級(jí)為1
123 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //副優(yōu)先級(jí)為0
124 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中斷
125 NVIC_Init(&NVIC_InitStructure); //根據(jù)參數(shù)初始化中斷寄存器
126 }
127
128
129 /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
130 ** 函數(shù)名稱(chēng): EXTI15_10_IRQHandler
131 ** 功能描述: 中斷15_10入口函數(shù)
132
133 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
134 void EXTI15_10_IRQHandler(void) //占空比減小
135 {
136 static uint8_t pwm_index = 0; //用于PWM查表
137 static uint8_t period_cnt = 0; //用于計(jì)算周期數(shù)
138 //就是上面兩個(gè)靜態(tài)變量沒(méi)有設(shè)置 ,導(dǎo)致一開(kāi)始按鍵只能按一次,在往下按他的pwm表就不往下查表了,我想了一晚上啊。
139 //今天早晨我突然發(fā)現(xiàn)可能是這兩個(gè)靜態(tài)變量沒(méi)有設(shè)置,一試,果然。開(kāi)心至極。2016.3.5
140
141 if(EXTI_GetITStatus(EXTI_Line13)!= RESET) //判斷是否發(fā)生中斷,發(fā)生則中斷標(biāo)志置1
142 {
143 Delay_Ms(5); //消抖
144
145 period_cnt++;
146
147 TIM2->CCR1 = indexWave[pwm_index]; //根據(jù)PWM表修改定時(shí)器的比較寄存器值
148 pwm_index++; //標(biāo)志PWM表的下一個(gè)元素
149
上一篇:STM32過(guò)濾器的作用
下一篇:對(duì)GPIO_Init(GPIOx,&GPIO_InitStructure)的理解
推薦閱讀最新更新時(shí)間:2025-05-22 20:25





設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- 人形機(jī)器人馬拉松背后的思考,兆易創(chuàng)新如何賦能機(jī)器人產(chǎn)業(yè)
- 一種基于STM32的智能柜控制器設(shè)計(jì)
- 小型傾轉(zhuǎn)旋翼機(jī)的無(wú)刷直流電機(jī)驅(qū)動(dòng)器設(shè)計(jì)
- 超高速攝影機(jī)電控系統(tǒng)設(shè)計(jì)
- 基于GPS自動(dòng)授時(shí)的無(wú)線智能控制器的設(shè)計(jì)
- 基于PTR2000的無(wú)線氣象信息采集系統(tǒng)設(shè)計(jì)
- Microchip推出MEC175xB系列器件,為嵌入式控制器引入硬件 抗量子攻擊能力
- 無(wú)人飛行器機(jī)載穩(wěn)定云臺(tái)控制系統(tǒng)的設(shè)計(jì)
- 匠芯創(chuàng)推出面向具身智能高性能實(shí)時(shí)處理器M7000
- 電動(dòng)汽車(chē)如何讓充電像加油一樣快?
- 一加8周年,首次面向用戶(hù)推出盲盒產(chǎn)品:可獲2022年新機(jī)等
- 榮耀手機(jī)推新用戶(hù)注冊(cè)免費(fèi)領(lǐng)延保服務(wù)
- 印度政府下令對(duì)蘋(píng)果App Store展開(kāi)反壟斷調(diào)查
- 誰(shuí)是下一代車(chē)載顯示技術(shù)?Micro-LED值得期待
- 消息稱(chēng)realme與王者榮耀達(dá)成深度合作
- Intrinsic ID與智聚芯聯(lián)簽署銷(xiāo)售代理協(xié)議
- 指針萬(wàn)用表、數(shù)字萬(wàn)用表的比較
- 磁翻板液位計(jì)批量用于DMF的液位測(cè)量
- 通用汽車(chē)轉(zhuǎn)向LFP電池,LG新能源和三星SDI擬在美建廠
- 蓋世汽車(chē)研究院:政策助推疊加技術(shù)迭代 全固態(tài)電池蓄勢(shì)待發(fā)
- 小鵬汽車(chē)董事長(zhǎng)預(yù)測(cè):2027年激光雷達(dá)非智能駕駛必備
- 解碼大眾汽車(chē)中國(guó)戰(zhàn)略 - 決戰(zhàn)智能化電氣化的三板斧
- 2025從具身智能大腦展望人形機(jī)器人發(fā)展
- “荊楚”人形機(jī)器人即將量產(chǎn),智能時(shí)代的新篇章!
- 小鵬純視覺(jué)方案:技術(shù)突圍與市場(chǎng)下沉的雙重博弈
- 為什么無(wú)人出租車(chē)能“零”事故,而智能駕駛輔助卻事故頻發(fā)?
- 重磅!一顆要顛覆全球智駕的芯片點(diǎn)亮了!
- 3D視覺(jué)技術(shù)為工業(yè)自動(dòng)化帶來(lái)新“視界”