1. 程式人生 > >STM32 使用TIM2_CH1(PA15) 輸出10K PWM訊號

STM32 使用TIM2_CH1(PA15) 輸出10K PWM訊號

PA15-> TIM2 Remap CH1

1.apb_init()
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

2.gpio_init()
    #define PWM_GPIO_IDX                        8                   //PA15
    #define PWM_GRP                             GPIOA
#define PWM_PIN GPIO_Pin_15 #define PWM_MODE GPIO_Mode_AF_PP GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); //disable JTAG GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE); //TIM2 Remap CH1->PA15 3.pwm_init() /* 72M / 10K = 720 period = 720-1 = 719 10分頻: prescaler = 10-1 = 9 */
#define LF_PERIOD 719 //週期 #define LF_PRESCALER 9 //分頻 #define LF_PULSE 360 //佔空比 void lf_init(void){ TIM_DeInit(TIM2);//將外設 TIMx 暫存器重設為預設值
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = LF_PERIOD;//設定了在下一個更新事件裝入活動的自動重灌載暫存器週期的值 TIM_TimeBaseStructure.TIM_Prescaler = LF_PRESCALER;//設定了用來作為 TIM1 時鐘頻率除數的預分頻值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;// 設定了時鐘分割 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//選擇了計數器模式 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//根據 TIM_TimeBaseInitStruct 中指定的引數初始化 TIMx 的時間基數單位 TIM_OCInitTypeDef TIM_OCInitStructure; /* PWM1 Mode configuration: Channel1 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//選擇定時器模式 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//選擇輸出比較狀態 TIM_OCInitStructure.TIM_Pulse = LF_PULSE;//設定了待裝入捕獲比較暫存器的脈衝值 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//輸出極性 TIM_OC1Init(TIM2, &TIM_OCInitStructure);//根據 TIM1_OCInitStruct 中指定的引數初始化 TIM1 通道 1 TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能或者失能 TIMx 在 CCR1 上的預裝載暫存器 TIM_ARRPreloadConfig(TIM2, ENABLE);//使能或者失能 TIMx 在 ARR 上的預裝載暫存器 TIM_Cmd(TIM2, ENABLE);//使能或者失能 TIMx 外設 }

TIM2_Remap

/* -----------------------------------------------------------------------
  //對PWM的頻率佔空比解析
  TIM3 Configuration: generate 4 PWM signals with 4 different duty cycles:
  The TIM3CLK frequency is set to SystemCoreClock (Hz), to get TIM3 counter
  clock at 24 MHz the Prescaler is computed as following:
   - Prescaler = (TIM3CLK / TIM3 counter clock) - 1
  SystemCoreClock is set to 72 MHz for Low-density, Medium-density, High-density
  and Connectivity line devices and to 24 MHz for Low-Density Value line and
  Medium-Density Value line devices

  The TIM3 is running at 36 KHz: TIM3 Frequency = TIM3 counter clock/(ARR + 1)
                                                = 24 MHz / 666 = 36 KHz
  TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50%
  TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 = 37.5%
  TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100 = 25%
  TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100 = 12.5%
    uint16_t CCR1_Val = 333;
    uint16_t CCR2_Val = 249;
    uint16_t CCR3_Val = 166;
    uint16_t CCR4_Val = 83;
----------------------------------------------------------------------- */

//以下為解決停止pwm訊號後偶發出現高電平 2018-08-11
void PwmControl(BOOL bCon){
    if(bCon){
        TIM_ForcedOC1Config(TIM2, TIM_ForcedAction_Active);
        TIM_Cmd(TIM2, ENABLE);
    }else{
        TIM_Cmd(TIM2, DISABLE);
        TIM_ForcedOC1Config(TIM2, TIM_ForcedAction_InActive);   //設定為非活動狀態,低電平
    }
}