此代碼,是基于stm32精英版,運用l298n電機驅動模塊,對直流電機進行調速程序。
IMG_20180212_電機pwm調速.jpg (2.7 MB, 下載次數: 179)
下載附件
2018-2-14 11:07 上傳
1,針對直流電機的不同頻率,設定不同的占空比,來實現速度的調節。
2、運用的stm32 的定時器time3 實現pwm的波形輸出。
單片機源程序如下:
- #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); //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
- }
- /****************************************************************
- * 函數名:void GPIO_Config(void)
- * 描述 :配置復用輸出PWM時用到的I/O
- * 輸入 :無
- * 輸出 :無
- * 調用 :main()調用
- 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; // 復用推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- }
- /****************************************************************
- * 函數名:void TIM3_Config(void)
- * 描述 :配置TIM3輸出的PWM信號的模式
- * 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的時鐘源確定TIM_Period和TIM_Prescaler (計數值和預分頻)
- * T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK=2.5ms
- * 因為 TIM_Period<65535,所以 TIM_Prescaler>1,即 TIM_Prescaler=2 //(預分頻 參數)
- * 所以 TIM_Period=59999=0xEA5F //計數值
- * 步驟二:根據TIM_Period的值,高低電平的先后D,確定CCR和TIM_OCPolarity
- * CH1:因為D=0.6,先高后低;
- * 所以CCR1=(TIM_Period+1)* D=36000;TIM_OCPolarity=TIM_OCPolarity_High
- * CH2:因為D=0.4,先高后低;
- * 所以CCR1=(TIM_Period+1)* (1-D)=36000;TIM_OCPolarity=TIM_OCPolarity_Low
- * 步驟三:基礎寄存器初始化
- * 步驟四:通道寄存器初始化
- * 步驟五:使能TIM3重載寄存器ARR
- * 步驟六:使能TIM3
- * 輸入 :無
- * 輸出 :無
- * 調用 :main()調用
- ***************************************************************/
- void TIM3_Config(void)
- {
- /******************** PWM信號電平跳變值 ***************************/
- //
- // u16 CCR1= 36000; //程序初值
- // u16 CCR2= 36000;
-
- /*******F=500hz的時候 占空比 1 時 *******/ // 注意: 每個F頻率對應一個 TIM_Period 。
- // u16 CCR1= 48000;
- // u16 CCR2= 48000; // 直流電機全速轉動
- /*******F=500hz的時候 占空比為0.8時 *******/
- // u16 CCR1= 38400;
- // u16 CCR2= 38400;
- /*******F=500hz的時候 占空比為0.7時 *******/
- // u16 CCR1= 33600;
- // u16 CCR2= 33600;
- /*******F=500hz的時候 占空比為0.6時 *******/
- // u16 CCR1= 28800;
- // u16 CCR2= 28800;
- /*******F=500hz的時候 占空比為0.5時 *******/
- // u16 CCR1= 24000;
- // u16 CCR2= 24000;
- /*******F=500hz的時候 占空比為0.4時 *******/
- // u16 CCR1= 19200;
- // u16 CCR2= 19200;
- /*******F=500hz的時候 占空比為0.3時 *******/
- // u16 CCR1= 14400;
- // u16 CCR2= 14400;
-
- /*******F=500hz的時候 占空比為0.2時 *******/
- // u16 CCR1= 9600;
- // u16 CCR2= 9600; //電機運動
- //
- /*******F=500hz的時候 占空比為0.1時 *******/
- // u16 CCR1= 4800;
- // u16 CCR2= 4800; // 電機不動
- /////////////////////////////////////////////////////////////////////////
- /*******F=1Khz的時候 占空比 1 時 *******/
- // u16 CCR1= 24000;
- // u16 CCR2= 24000; // 直流電機全速轉動
- /*******F=1Khz的時候 占空比為0.8時 *******/
- u16 CCR1= 19200;
- u16 CCR2= 19200;
- /*******F=1Khz的時候 占空比為0.7時 *******/
- // u16 CCR1= 16800;
- // u16 CCR2= 16800;
- /*******F=1Khz的時候 占空比為0.6時 *******/
- // u16 CCR1= 14400;
- // u16 CCR2= 14400;
- /*******F=1Khz的時候 占空比為0.5時 *******/
- // u16 CCR1= 12000;
- // u16 CCR2= 12000;
- /*******F=1Khz的時候 占空比為0.4時 *******/
- // u16 CCR1= 9600;
- // u16 CCR2= 9600;
- /*******F=1Khz的時候 占空比為0.3時 *******/
- // u16 CCR1= 7200;
- // u16 CCR2= 7200; //電機運動
-
- /*******F=1Khz的時候 占空比為0.2時 *******/
- // u16 CCR1= 4800;
- // u16 CCR2= 4800; //電機起步 yjf
-
- /*******F=1Khz的時候 占空比為0.1時 *******/
- // u16 CCR1= 2400;
- // u16 CCR2= 2400; // 電機不動
- //* 頻率為1k時電機皆為全速運行,無調速,且噪音較大。 */
- /////////////////////////////////////////////////////////////////////////
- /*******F=5Khz的時候 占空比 1 時 *******/
- // u16 CCR1= 4800;
- // u16 CCR2= 4800; // 直流電機全速轉動
- /*******F=5Khz的時候 占空比為0.9時 *******/
- // u16 CCR1= 4320;
- // u16 CCR2= 4320;
- /*******F=5Khz的時候 占空比為0.8時 *******/
- // u16 CCR1= 3840;
- // u16 CCR2= 3840;
- /*******F=5Khz的時候 占空比為0.7時 *******/
- // u16 CCR1= 3360;
- // u16 CCR2= 3360;
- /*******F=5Khz的時候 占空比為0.6時 *******/
- // u16 CCR1= 2880;
- // u16 CCR2= 2880;
- /*******F=5Khz的時候 占空比為0.5時 *******/
- // u16 CCR1= 2400;
- // u16 CCR2= 2400;
- /*******F=5Khz的時候 占空比為0.4時 *******/
- // u16 CCR1= 1920;
- // u16 CCR2= 1920; // 直流電機轉動
- /*******F=5Khz的時候 占空比為0.3時 *******/
- // u16 CCR1= 1440;
- // u16 CCR2= 1440; //直流電機起步轉動
- //
- /*******F=5Khz的時候 占空比為0.2時 *******/
- // u16 CCR1= 960;
- // u16 CCR2= 960; //直流電機不轉動
- //
- /*******F=5Khz的時候 占空比為0.1時 *******/
- // u16 CCR1= 480;
- // u16 CCR2= 480; //直流電機不轉動
-
- /******************** PWM信號電平跳變值 ***************************/
- ////////////////////////////////////////////////////////////////////////////
- /////////////////////////////////////////////////////////////////////////
- /*******F=10Khz的時候 占空比 1 時 *******/
- // u16 CCR1= 2400;
- // u16 CCR2= 2400; // 直流電機全速轉動
- /*******F=10Khz的時候 占空比為0.8時 *******/
- // u16 CCR1= 1920;
- // u16 CCR2= 1920;
- /*******F=10Khz的時候 占空比為0.7時 *******/
- // u16 CCR1= 1680;
- // u16 CCR2= 1680;
- /*******F=10Khz的時候 占空比為0.6時 *******/
- // u16 CCR1= 1440;
- // u16 CCR2= 1440;
- /*******F=10Khz的時候 占空比為0.5時 *******/
- // u16 CCR1= 1200;
- // u16 CCR2= 1200;
- /*******F=10Khz的時候 占空比為0.4時 *******/
- // u16 CCR1= 960;
- // u16 CCR2= 960; // 直流電機轉動
- /*******F=10Khz的時候 占空比為0.3時 *******/
- // u16 CCR1= 720;
- // u16 CCR2= 720; // 直流電機不轉
- //
- /*******F=10Khz的時候 占空比為0.2時 *******/
- // u16 CCR1= 480;
- // u16 CCR2= 480; //直流電機不轉
- /******************** PWM信號電平跳變值 ***************************/
- ////////////////////////////////////////////////////////////////////////////
- /////////////////////////////////////////////////////////////////////////
- /*******F=15Khz的時候 占空比 1 時 *******/
- // u16 CCR1= 1600;
- // u16 CCR2= 1600; // 直流電機全速轉動
- /*******F=15Khz的時候 占空比為0.8時 *******/
- // u16 CCR1= 1280;
- // u16 CCR2= 1280;
- /*******F=15Khz的時候 占空比為0.7時 *******/
- // u16 CCR1= 1120;
- // u16 CCR2= 1120;
- /*******F=15Khz的時候 占空比為0.6時 *******/
- // u16 CCR1= 960;
- // u16 CCR2= 960;
- /*******F=15Khz的時候 占空比為0.5時 *******/
- // u16 CCR1= 800;
- // u16 CCR2= 800;
- /*******F=15Khz的時候 占空比為0.4時 *******/
- // u16 CCR1= 640;
- // u16 CCR2= 640; // 直流電機轉動
- /*******F=15Khz的時候 占空比為0.3時 *******/
- // u16 CCR1= 480;
- // u16 CCR2= 480; // 直流電機不轉
-
- /*******F=15Khz的時候 占空比為0.2時 *******/
- // u16 CCR1= 320;
- // u16 CCR2= 320; //直流電機不轉
- /******************** PWM信號電平跳變值 ***************************/
- ////////////////////////////////////////////////////////////////////////////
-
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
-
- /*PCLK1經過2倍頻后作為TIM3的時鐘源等于72MHz*/
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
-
- /* Time base configuration */
- TIM_TimeBaseStructure.TIM_Period =47999; // 計數值 47999
- TIM_TimeBaseStructure.TIM_Prescaler = 2; //設置預分頻:預分頻=2,即為72/3=24MHz 預分頻(時鐘分頻)72M/(2+1)=24M
-
-
- TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分頻系數:不分頻
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數溢出模式
- 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; //設置跳變值,當計數器計數到這個值時,電平發生跳變
- TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High; //當定時器計數值小于CCR1時為高電平
- 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; //設置通道2的電平跳變值,輸出另外一個占空比的PWM
- //TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //當定時器計數值小于CCR2時為低電平
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //當定時器計數值小于CCr2 時為高電平
- 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
- }
- /******************** 定時器參考算法 ***************************/
- //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; //復用推挽輸出
- // 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; //復用推挽輸出
- // 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; //復用推挽輸出
- // 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; //復用推挽輸出
- // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- // GPIO_Init(GPIOB, &GPIO_InitStructure);
- // TIM_TimeBaseStructure.TIM_Period = 59999; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值 80K
- // TIM_TimeBaseStructure.TIM_Prescaler =2; //設置用來作為TIMx時鐘頻率除數的預分頻值 不分頻
- // TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割:TDTS = Tck_tim
- // TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式
- // TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位
- //
- // TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈沖寬度調制模式1
- // TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
- // TIM_OCInitStructure.TIM_Pulse = 36000; //設置待裝入捕獲比較寄存器的脈沖值
- // TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
- // TIM_OC1Init(TIM3, &TIM_OCInitStructure);
- // TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIMx在CCR1上的預裝載寄存器
- // TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈沖寬度調制模式1
- // TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
- // TIM_OCInitStructure.TIM_Pulse = 36000; //設置待裝入捕獲比較寄存器的脈沖值
- // TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
- // TIM_OC2Init(TIM3, &TIM_OCInitStructure);
- // TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIMx在CCR2上的預裝載寄存器
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
PWM.rar
(280.82 KB, 下載次數: 884)
2018-2-14 15:05 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|