【沁恒微CH32V307评估板试用体验】利用高级定时器TIM1产生PWM - RISC-V MCU技术社区 - 电子技术william hill官网 - 广受欢迎的专业电子william hill官网 - 威廉希尔官方网站
分享 收藏 返回

Youzhiyu 关注 私信
[文章]

【沁恒微CH32V307评估板试用体验】利用高级定时器TIM1产生PWM

本次利用tiM1产生一个18KHz的PWM波

1:对TIM1及输出通道功能管脚等进行初始化
  1. void TIM1_PWMOut_Init( u16 arr, u16 psc, u16 ccp )
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStructure={0};
  4.     TIM_OCInitTypeDef TIM_OCInitStructure={0};
  5.     TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure={0};
  6.     NVIC_InitTypeDef NVIC_InitStruct;
  7.     //开外设时钟
  8.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE );
  9.    //初始化管脚PA.8的工作模式
  10.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  11.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  12.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.     GPIO_Init( GPIOA, &GPIO_InitStructure );
  14.    //初始化时基单元
  15.     TIM_TimeBaseInitStructure.TIM_Period = arr;
  16.     TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
  17.     TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  18.     TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  19.     TIM_TimeBaseInit( TIM1, &TIM_TimeBaseInitStructure);
  20.      //初始化输出比较单元,采用PWM1模式
  21.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  22.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  23.     TIM_OCInitStructure.TIM_Pulse = ccp;
  24.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  25.     TIM_OC1Init( TIM1, &TIM_OCInitStructure );
  26.     //使能TIM1的PWM输出,并禁止或使能预装载寄存器
  27.     TIM_CtrlPWMOutputs(TIM1, ENABLE );
  28.     TIM_OC1PreloadConfig( TIM1, TIM_OCPreload_Disable );
  29.     TIM_ARRPreloadConfig( TIM1, ENABLE );
  30.     //开启比较匹配时的中断使能,为后续实验准备的,本次PWM实际不需要开启中断
  31.     TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);
  32.     //中断优先级NVIC设置:中断通道、抢占优先级、响应优先级、使能
  33.     NVIC_InitStruct.NVIC_IRQChannel = TIM1_CC_IRQn;
  34.     NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
  35.     NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
  36.     NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  37.     NVIC_Init(&NVIC_InitStruct);
  38.    //使能TIM1
  39.     TIM_Cmd( TIM1, ENABLE );
  40. }

2:在主函数中调用TIM初始化函数
  1. int main(void)
  2. {
  3.         Delay_Init();
  4.         //sysclk = 72MHz psc = 3 ,4分频18kHz, ARR=999
  5.         TIM1_PWMOut_Init( 999, 3, 499 );

  6.         while(1)
  7.        {
  8.              Delay_Ms(2000);
  9.         }
  10. }

以上代码就可以在PA.8引脚输出18KHz的PWM波。
实验视频:
    https://yingsheng.elecfans.com/s ... cWZzDhdnP%2FPJOgJvg



更多回帖

×
发帖