|
此代碼,是基于stm32精英版,運(yùn)用l298n電機(jī)驅(qū)動(dòng)模塊,對直流電機(jī)進(jìn)行調(diào)速程序。
IMG_20180212_電機(jī)pwm調(diào)速.jpg (2.7 MB, 下載次數(shù): 179)
下載附件
2018-2-14 11:07 上傳
1,針對直流電機(jī)的不同頻率,設(shè)定不同的占空比,來實(shí)現(xiàn)速度的調(diào)節(jié)。
2、運(yùn)用的stm32 的定時(shí)器time3 實(shí)現(xiàn)pwm的波形輸出。
單片機(jī)源程序如下:
- #include "stm32f10x.h"
- #include "delay.h"
- #include "sys.h"
- void Delay(u32 count)
- {
- u32 i=0;
- for(;i<count;i++);
- }
- void NVIC_Configuration(void)
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
- }
- /****************************************************************
- * 函數(shù)名:void GPIO_Config(void)
- * 描述 :配置復(fù)用輸出PWM時(shí)用到的I/O
- * 輸入 :無
- * 輸出 :無
- * 調(diào)用 :main()調(diào)用
- PA6 PA7 兩路 PWM
- ***************************************************************/
- void GPIO_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- /* GPIOA and GPIOB clock enable */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE); //
-
- /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 復(fù)用推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- }
- /****************************************************************
- * 函數(shù)名:void TIM3_Config(void)
- * 描述 :配置TIM3輸出的PWM信號(hào)的模式
- * CH1:輸出 T=2.5ms(f=1/2.5ms=400Hz) 占空比D=0.6的PWM波(高電平在前,低電平在后)
- * CH2:輸出 T=2.5ms(f=1/2.5ms=400Hz) D=0.4的PWM波(高電平在后,低電平在前)
- * 步驟一:通過T和TIMxCLK的時(shí)鐘源確定TIM_Period和TIM_Prescaler (計(jì)數(shù)值和預(yù)分頻)
- * T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK=2.5ms
- * 因?yàn)?TIM_Period<65535,所以 TIM_Prescaler>1,即 TIM_Prescaler=2 //(預(yù)分頻 參數(shù))
- * 所以 TIM_Period=59999=0xEA5F //計(jì)數(shù)值
- * 步驟二:根據(jù)TIM_Period的值,高低電平的先后D,確定CCR和TIM_OCPolarity
- * CH1:因?yàn)镈=0.6,先高后低;
- * 所以CCR1=(TIM_Period+1)* D=36000;TIM_OCPolarity=TIM_OCPolarity_High
- * CH2:因?yàn)镈=0.4,先高后低;
- * 所以CCR1=(TIM_Period+1)* (1-D)=36000;TIM_OCPolarity=TIM_OCPolarity_Low
- * 步驟三:基礎(chǔ)寄存器初始化
- * 步驟四:通道寄存器初始化
- * 步驟五:使能TIM3重載寄存器ARR
- * 步驟六:使能TIM3
- * 輸入 :無
- * 輸出 :無
- * 調(diào)用 :main()調(diào)用
- ***************************************************************/
- void TIM3_Config(void)
- {
- /******************** PWM信號(hào)電平跳變值 ***************************/
- //
- // u16 CCR1= 36000; //程序初值
- // u16 CCR2= 36000;
-
- /*******F=500hz的時(shí)候 占空比 1 時(shí) *******/ // 注意: 每個(gè)F頻率對應(yīng)一個(gè) TIM_Period 。
- // u16 CCR1= 48000;
- // u16 CCR2= 48000; // 直流電機(jī)全速轉(zhuǎn)動(dòng)
- /*******F=500hz的時(shí)候 占空比為0.8時(shí) *******/
- // u16 CCR1= 38400;
- // u16 CCR2= 38400;
- /*******F=500hz的時(shí)候 占空比為0.7時(shí) *******/
- // u16 CCR1= 33600;
- // u16 CCR2= 33600;
- /*******F=500hz的時(shí)候 占空比為0.6時(shí) *******/
- // u16 CCR1= 28800;
- // u16 CCR2= 28800;
- /*******F=500hz的時(shí)候 占空比為0.5時(shí) *******/
- // u16 CCR1= 24000;
- // u16 CCR2= 24000;
- /*******F=500hz的時(shí)候 占空比為0.4時(shí) *******/
- // u16 CCR1= 19200;
- // u16 CCR2= 19200;
- /*******F=500hz的時(shí)候 占空比為0.3時(shí) *******/
- // u16 CCR1= 14400;
- // u16 CCR2= 14400;
-
- /*******F=500hz的時(shí)候 占空比為0.2時(shí) *******/
- // u16 CCR1= 9600;
- // u16 CCR2= 9600; //電機(jī)運(yùn)動(dòng)
- //
- /*******F=500hz的時(shí)候 占空比為0.1時(shí) *******/
- // u16 CCR1= 4800;
- // u16 CCR2= 4800; // 電機(jī)不動(dòng)
- /////////////////////////////////////////////////////////////////////////
- /*******F=1Khz的時(shí)候 占空比 1 時(shí) *******/
- // u16 CCR1= 24000;
- // u16 CCR2= 24000; // 直流電機(jī)全速轉(zhuǎn)動(dòng)
- /*******F=1Khz的時(shí)候 占空比為0.8時(shí) *******/
- u16 CCR1= 19200;
- u16 CCR2= 19200;
- /*******F=1Khz的時(shí)候 占空比為0.7時(shí) *******/
- // u16 CCR1= 16800;
- // u16 CCR2= 16800;
- /*******F=1Khz的時(shí)候 占空比為0.6時(shí) *******/
- // u16 CCR1= 14400;
- // u16 CCR2= 14400;
- /*******F=1Khz的時(shí)候 占空比為0.5時(shí) *******/
- // u16 CCR1= 12000;
- // u16 CCR2= 12000;
- /*******F=1Khz的時(shí)候 占空比為0.4時(shí) *******/
- // u16 CCR1= 9600;
- // u16 CCR2= 9600;
- /*******F=1Khz的時(shí)候 占空比為0.3時(shí) *******/
- // u16 CCR1= 7200;
- // u16 CCR2= 7200; //電機(jī)運(yùn)動(dòng)
-
- /*******F=1Khz的時(shí)候 占空比為0.2時(shí) *******/
- // u16 CCR1= 4800;
- // u16 CCR2= 4800; //電機(jī)起步 yjf
-
- /*******F=1Khz的時(shí)候 占空比為0.1時(shí) *******/
- // u16 CCR1= 2400;
- // u16 CCR2= 2400; // 電機(jī)不動(dòng)
- //* 頻率為1k時(shí)電機(jī)皆為全速運(yùn)行,無調(diào)速,且噪音較大。 */
- /////////////////////////////////////////////////////////////////////////
- /*******F=5Khz的時(shí)候 占空比 1 時(shí) *******/
- // u16 CCR1= 4800;
- // u16 CCR2= 4800; // 直流電機(jī)全速轉(zhuǎn)動(dòng)
- /*******F=5Khz的時(shí)候 占空比為0.9時(shí) *******/
- // u16 CCR1= 4320;
- // u16 CCR2= 4320;
- /*******F=5Khz的時(shí)候 占空比為0.8時(shí) *******/
- // u16 CCR1= 3840;
- // u16 CCR2= 3840;
- /*******F=5Khz的時(shí)候 占空比為0.7時(shí) *******/
- // u16 CCR1= 3360;
- // u16 CCR2= 3360;
- /*******F=5Khz的時(shí)候 占空比為0.6時(shí) *******/
- // u16 CCR1= 2880;
- // u16 CCR2= 2880;
- /*******F=5Khz的時(shí)候 占空比為0.5時(shí) *******/
- // u16 CCR1= 2400;
- // u16 CCR2= 2400;
- /*******F=5Khz的時(shí)候 占空比為0.4時(shí) *******/
- // u16 CCR1= 1920;
- // u16 CCR2= 1920; // 直流電機(jī)轉(zhuǎn)動(dòng)
- /*******F=5Khz的時(shí)候 占空比為0.3時(shí) *******/
- // u16 CCR1= 1440;
- // u16 CCR2= 1440; //直流電機(jī)起步轉(zhuǎn)動(dòng)
- //
- /*******F=5Khz的時(shí)候 占空比為0.2時(shí) *******/
- // u16 CCR1= 960;
- // u16 CCR2= 960; //直流電機(jī)不轉(zhuǎn)動(dòng)
- //
- /*******F=5Khz的時(shí)候 占空比為0.1時(shí) *******/
- // u16 CCR1= 480;
- // u16 CCR2= 480; //直流電機(jī)不轉(zhuǎn)動(dòng)
-
- /******************** PWM信號(hào)電平跳變值 ***************************/
- ////////////////////////////////////////////////////////////////////////////
- /////////////////////////////////////////////////////////////////////////
- /*******F=10Khz的時(shí)候 占空比 1 時(shí) *******/
- // u16 CCR1= 2400;
- // u16 CCR2= 2400; // 直流電機(jī)全速轉(zhuǎn)動(dòng)
- /*******F=10Khz的時(shí)候 占空比為0.8時(shí) *******/
- // u16 CCR1= 1920;
- // u16 CCR2= 1920;
- /*******F=10Khz的時(shí)候 占空比為0.7時(shí) *******/
- // u16 CCR1= 1680;
- // u16 CCR2= 1680;
- /*******F=10Khz的時(shí)候 占空比為0.6時(shí) *******/
- // u16 CCR1= 1440;
- // u16 CCR2= 1440;
- /*******F=10Khz的時(shí)候 占空比為0.5時(shí) *******/
- // u16 CCR1= 1200;
- // u16 CCR2= 1200;
- /*******F=10Khz的時(shí)候 占空比為0.4時(shí) *******/
- // u16 CCR1= 960;
- // u16 CCR2= 960; // 直流電機(jī)轉(zhuǎn)動(dòng)
- /*******F=10Khz的時(shí)候 占空比為0.3時(shí) *******/
- // u16 CCR1= 720;
- // u16 CCR2= 720; // 直流電機(jī)不轉(zhuǎn)
- //
- /*******F=10Khz的時(shí)候 占空比為0.2時(shí) *******/
- // u16 CCR1= 480;
- // u16 CCR2= 480; //直流電機(jī)不轉(zhuǎn)
- /******************** PWM信號(hào)電平跳變值 ***************************/
- ////////////////////////////////////////////////////////////////////////////
- /////////////////////////////////////////////////////////////////////////
- /*******F=15Khz的時(shí)候 占空比 1 時(shí) *******/
- // u16 CCR1= 1600;
- // u16 CCR2= 1600; // 直流電機(jī)全速轉(zhuǎn)動(dòng)
- /*******F=15Khz的時(shí)候 占空比為0.8時(shí) *******/
- // u16 CCR1= 1280;
- // u16 CCR2= 1280;
- /*******F=15Khz的時(shí)候 占空比為0.7時(shí) *******/
- // u16 CCR1= 1120;
- // u16 CCR2= 1120;
- /*******F=15Khz的時(shí)候 占空比為0.6時(shí) *******/
- // u16 CCR1= 960;
- // u16 CCR2= 960;
- /*******F=15Khz的時(shí)候 占空比為0.5時(shí) *******/
- // u16 CCR1= 800;
- // u16 CCR2= 800;
- /*******F=15Khz的時(shí)候 占空比為0.4時(shí) *******/
- // u16 CCR1= 640;
- // u16 CCR2= 640; // 直流電機(jī)轉(zhuǎn)動(dòng)
- /*******F=15Khz的時(shí)候 占空比為0.3時(shí) *******/
- // u16 CCR1= 480;
- // u16 CCR2= 480; // 直流電機(jī)不轉(zhuǎn)
-
- /*******F=15Khz的時(shí)候 占空比為0.2時(shí) *******/
- // u16 CCR1= 320;
- // u16 CCR2= 320; //直流電機(jī)不轉(zhuǎn)
- /******************** PWM信號(hào)電平跳變值 ***************************/
- ////////////////////////////////////////////////////////////////////////////
-
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
-
- /*PCLK1經(jīng)過2倍頻后作為TIM3的時(shí)鐘源等于72MHz*/
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
-
- /* Time base configuration */
- TIM_TimeBaseStructure.TIM_Period =47999; // 計(jì)數(shù)值 47999
- TIM_TimeBaseStructure.TIM_Prescaler = 2; //設(shè)置預(yù)分頻:預(yù)分頻=2,即為72/3=24MHz 預(yù)分頻(時(shí)鐘分頻)72M/(2+1)=24M
-
-
- TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設(shè)置時(shí)鐘分頻系數(shù):不分頻
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計(jì)數(shù)溢出模式
- TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
- /* PWM1 Mode configuration: Channel1 */
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置為PWM模式1
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
-
- TIM_OCInitStructure.TIM_Pulse = CCR1; //設(shè)置跳變值,當(dāng)計(jì)數(shù)器計(jì)數(shù)到這個(gè)值時(shí),電平發(fā)生跳變
- TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High; //當(dāng)定時(shí)器計(jì)數(shù)值小于CCR1時(shí)為高電平
- TIM_OC1Init(TIM3, &TIM_OCInitStructure); //使能通道1
- TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
-
- /* PWM1 Mode configuration: Channel2 */
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_Pulse = CCR2; //設(shè)置通道2的電平跳變值,輸出另外一個(gè)占空比的PWM
- //TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //當(dāng)定時(shí)器計(jì)數(shù)值小于CCR2時(shí)為低電平
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //當(dāng)定時(shí)器計(jì)數(shù)值小于CCr2 時(shí)為高電平
- TIM_OC2Init(TIM3, &TIM_OCInitStructure); //使能通道2
- TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
-
- TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIM3重載寄存器ARR
- /* TIM3 enable counter */
- TIM_Cmd(TIM3, ENABLE); //使能TIM3
- }
- /******************** 定時(shí)器參考算法 ***************************/
- //void TIM3_Init(void)
- //{
- // GPIO_InitTypeDef GPIO_InitStructure;
- // TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- // TIM_OCInitTypeDef TIM_OCInitStructure;
- // RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
- // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO |RCC_APB2Periph_GPIOB , ENABLE);
- //
- // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM_CH1
- // 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_7; //TIM_CH2
- // 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_0; //TIM_CH3
- // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出
- // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- // GPIO_Init(GPIOB, &GPIO_InitStructure);
- // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //TIM_CH4
- // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出
- // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- // GPIO_Init(GPIOB, &GPIO_InitStructure);
- // TIM_TimeBaseStructure.TIM_Period = 59999; //設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值 80K
- // TIM_TimeBaseStructure.TIM_Prescaler =2; //設(shè)置用來作為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(TIM3, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時(shí)間基數(shù)單位
- //
- // TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時(shí)器模式:TIM脈沖寬度調(diào)制模式1
- // TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
- // TIM_OCInitStructure.TIM_Pulse = 36000; //設(shè)置待裝入捕獲比較寄存器的脈沖值
- // TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
- // TIM_OC1Init(TIM3, &TIM_OCInitStructure);
- // TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIMx在CCR1上的預(yù)裝載寄存器
- // TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時(shí)器模式:TIM脈沖寬度調(diào)制模式1
- // TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
- // TIM_OCInitStructure.TIM_Pulse = 36000; //設(shè)置待裝入捕獲比較寄存器的脈沖值
- // TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
- // TIM_OC2Init(TIM3, &TIM_OCInitStructure);
- // TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIMx在CCR2上的預(yù)裝載寄存器
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
PWM.rar
(280.82 KB, 下載次數(shù): 884)
2018-2-14 15:05 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|