问答

汇集网友智慧,解决技术难题

21ic问答首页 - AT32F105如何实现PB13单独发出pwm

PWM AT32F 105 小白

AT32F105如何实现PB13单独发出pwm

zrmouse2025-05-12
如题,小白感谢
回答 +关注 6
1797人浏览 2人回答问题 分享 举报
2 个回答
    1. #include "at32f10x.h"

    2. void pwm_pb13_init(void)
    3. {
    4.     GPIO_InitTypeDef GPIO_InitStructure;
    5.     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    6.     TIM_OCInitTypeDef TIM_OCInitStructure;

    7.     // 1. 使能 GPIOB 和 TIM1 时钟
    8.     RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOB | RCC_APB2PERIPH_TIM1, ENABLE);

    9.     // 2. 配置 PB13 为复用推挽输出(TIM1_CH1N)
    10.     GPIO_InitStructure.GPIO_Pin = GPIO_Pins_13;
    11.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽
    12.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    13.     GPIO_Init(GPIOB, &GPIO_InitStructure);

    14.     // 3. 初始化 TIM1 基本定时参数(设定 PWM 周期)
    15.     TIM_TimeBaseStructure.TIM_Period = 999;        // 自动重装值 ARR
    16.     TIM_TimeBaseStructure.TIM_Prescaler = 71;      // 预分频器 PSC(72MHz / (71+1) = 1MHz)
    17.     TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    18.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    19.     TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

    20.     // 4. 配置 PWM 模式,通道1
    21.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    22.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;     // CH1 不输出
    23.     TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;    // 启用 CH1N 输出
    24.     TIM_OCInitStructure.TIM_Pulse = 500; // 比较值,控制占空比(占空比 = Pulse / (Period+1))
    25.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    26.     TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
    27.     TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
    28.     TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
    29.     TIM_OC1Init(TIM1, &TIM_OCInitStructure);

    30.     // 5. 启用定时器 PWM 输出
    31.     TIM_CtrlPWMOutputs(TIM1, ENABLE); // 高级定时器需要显式开启主输出
    32.     TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
    33.     TIM_ARRPreloadConfig(TIM1, ENABLE);

    34.     // 6. 启动 TIM1
    35.     TIM_Cmd(TIM1, ENABLE);
    36. }


  • gpio_init_type gpio_init_struct;
      tmr_output_config_type tmr_output_struct;
      tmr_brkdt_config_type tmr_brkdt_struct;

      gpio_default_para_init(&gpio_init_struct);

      /* add user code begin tmr1_init 1 */

      /* add user code end tmr1_init 1 */

      /* configure the CH1C pin */
      gpio_init_struct.gpio_pins = GPIO_PINS_13;
      gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
      gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
      gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
      gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_MODERATE;
      gpio_init(GPIOB, &gpio_init_struct);

      /* configure counter settings */
      tmr_cnt_dir_set(TMR1, TMR_COUNT_UP);
      tmr_clock_source_div_set(TMR1, TMR_CLOCK_DIV1);
      tmr_repetition_counter_set(TMR1, 0);
      tmr_period_buffer_enable(TMR1, FALSE);
      tmr_base_init(TMR1, 499, 14);

      /* configure primary mode settings */
      tmr_sub_sync_mode_set(TMR1, FALSE);
      tmr_primary_mode_select(TMR1, TMR_PRIMARY_SEL_RESET);

      /* configure channel 1 output settings */
      tmr_output_struct.oc_mode = TMR_OUTPUT_CONTROL_PWM_MODE_A;
      tmr_output_struct.oc_output_state = FALSE;
      tmr_output_struct.occ_output_state = TRUE;
      tmr_output_struct.oc_polarity = TMR_OUTPUT_ACTIVE_HIGH;
      tmr_output_struct.occ_polarity = TMR_OUTPUT_ACTIVE_HIGH;
      tmr_output_struct.oc_idle_state = FALSE;
      tmr_output_struct.occ_idle_state = FALSE;
      tmr_output_channel_config(TMR1, TMR_SELECT_CHANNEL_1, &tmr_output_struct);
      tmr_channel_value_set(TMR1, TMR_SELECT_CHANNEL_1, 250);
      tmr_output_channel_buffer_enable(TMR1, TMR_SELECT_CHANNEL_1, FALSE);

      tmr_output_channel_immediately_set(TMR1, TMR_SELECT_CHANNEL_1, FALSE);

      /* configure break and dead-time settings */
      tmr_brkdt_struct.brk_enable = FALSE;
      tmr_brkdt_struct.auto_output_enable = FALSE;
      tmr_brkdt_struct.brk_polarity = TMR_BRK_INPUT_ACTIVE_LOW;
      tmr_brkdt_struct.fcsoen_state = FALSE;
      tmr_brkdt_struct.fcsodis_state = FALSE;
      tmr_brkdt_struct.wp_level = TMR_WP_OFF;
      tmr_brkdt_struct.deadtime = 0;
      tmr_brkdt_config(TMR1, &tmr_brkdt_struct);


      tmr_output_enable(TMR1, FALSE);

      tmr_counter_enable(TMR1, TRUE);

您需要登录后才可以回复 登录 | 注册