|
/*
* 步進電機S曲線加減速
* 若發(fā)現(xiàn)啟動后電機有堵轉(zhuǎn)的情況請增大數(shù)組中的數(shù)值,簡單的方法是在調(diào)用的時候直接乘個倍數(shù)
*/
下面是樓主的PWM.c文件:
- #include "PWM.h"
- static void TIM_GPIO_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
- /* PA0(TIM2_CH1) PA1(TIM5_CH2) PA6(TIM3_CH1) */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_6;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 復(fù)用推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- /* PB6(TIM4_CH1) */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 復(fù)用推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- }
- static void TIM2_Mode_Config(void)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
-
- /* TIM2 開啟時鐘 */
- //PCLK1經(jīng)過2倍頻后作為TIM2的時鐘源等于72MHz
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
- /* TIM2基本配置 */
- TIM_TimeBaseStructure.TIM_Period = 1000;
- TIM_TimeBaseStructure.TIM_Prescaler = 0; //設(shè)置預(yù)分頻:不預(yù)分頻,即為72MHz
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //設(shè)置時鐘分頻系數(shù):不分頻
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數(shù)模式
- TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
-
- /* PWM2模式通道1 */
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //配置為PWM模式2
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能比較輸出
- TIM_OCInitStructure.TIM_Pulse = 200; //設(shè)置跳變值,當(dāng)計數(shù)器計數(shù)到這個值時,電平發(fā)生跳變
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //當(dāng)定時器計數(shù)值小于CCR1_Val時為高電平
- TIM_OC1Init(TIM2, &TIM_OCInitStructure); //使能通道1
- TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
- TIM_ARRPreloadConfig(TIM2, ENABLE); // 使能TIM3重載寄存器ARR
-
- TIM_Cmd(TIM2, DISABLE); //使能TIM3
- }
- static void TIM3_Mode_Config(void)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
-
- /* TIM3 開啟時鐘 */
- //PCLK1經(jīng)過2倍頻后作為TIM3的時鐘源等于72MHz
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
- /* TIM3基本配置 */
- TIM_TimeBaseStructure.TIM_Period = 1000;
- TIM_TimeBaseStructure.TIM_Prescaler = 0; //設(shè)置預(yù)分頻:不預(yù)分頻,即為72MHz
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //設(shè)置時鐘分頻系數(shù):不分頻
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數(shù)模式
- TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
-
- /* PWM2模式通道1 */
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //配置為PWM模式2
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能比較輸出
- TIM_OCInitStructure.TIM_Pulse = 200; //設(shè)置跳變值,當(dāng)計數(shù)器計數(shù)到這個值時,電平發(fā)生跳變
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //當(dāng)定時器計數(shù)值小于CCR1_Val時為高電平
- TIM_OC1Init(TIM3, &TIM_OCInitStructure); //使能通道1
- TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
- TIM_ARRPreloadConfig(TIM3, ENABLE); // 使能TIM3重載寄存器ARR
-
- TIM_Cmd(TIM3, DISABLE); //使能TIM3
- }
- static void TIM4_Mode_Config(void)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
-
- /* TIM4 開啟時鐘 */
- //PCLK1經(jīng)過2倍頻后作為TIM3的時鐘源等于72MHz
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
- /* TIM4基本配置 */
- TIM_TimeBaseStructure.TIM_Period = 1000;
- TIM_TimeBaseStructure.TIM_Prescaler = 0; //設(shè)置預(yù)分頻:不預(yù)分頻,即為72MHz
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //設(shè)置時鐘分頻系數(shù):不分頻
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數(shù)模式
- TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
-
- /* PWM2模式通道1 */
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //配置為PWM模式2
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能比較輸出
- TIM_OCInitStructure.TIM_Pulse = 200; //設(shè)置跳變值,當(dāng)計數(shù)器計數(shù)到這個值時,電平發(fā)生跳變
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //當(dāng)定時器計數(shù)值小于CCR1_Val時為高電平
- TIM_OC1Init(TIM4, &TIM_OCInitStructure); //使能通道1
- TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
- TIM_ARRPreloadConfig(TIM4, ENABLE); // 使能TIM4重載寄存器ARR
-
- TIM_Cmd(TIM4, DISABLE); //使能TIM4
- }
- static void TIM5_Mode_Config(void)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
-
- /* TIM5 開啟時鐘 */
- //PCLK1經(jīng)過2倍頻后作為TIM3的時鐘源等于72MHz
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
- /* TIM5基本配置 */
- TIM_TimeBaseStructure.TIM_Period = 1000;
- TIM_TimeBaseStructure.TIM_Prescaler = 0; //設(shè)置預(yù)分頻:不預(yù)分頻,即為72MHz
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //設(shè)置時鐘分頻系數(shù):不分頻
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數(shù)模式
- TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
-
- /* PWM2模式通道1 */
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //配置為PWM模式2
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能比較輸出
- TIM_OCInitStructure.TIM_Pulse = 200; //設(shè)置跳變值,當(dāng)計數(shù)器計數(shù)到這個值時,電平發(fā)生跳變
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //當(dāng)定時器計數(shù)值小于CCR1_Val時為高電平
- TIM_OC2Init(TIM5, &TIM_OCInitStructure); //使能通道1
- TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable);
- TIM_ARRPreloadConfig(TIM5, ENABLE); //使能TIM5重載寄存器ARR
- TIM_Cmd(TIM5, DISABLE); //使能TIM5
- }
- void TIM_Config(void)
- {
- TIM_GPIO_Config();
- TIM2_Mode_Config();
- TIM3_Mode_Config();
- TIM4_Mode_Config();
- TIM5_Mode_Config();
- }
復(fù)制代碼
|
|