打印
[单片机芯片]

使用定时器输出PWM

[复制链接]
787|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-3-7 08:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一,功能描述
使用定时器的四个比较捕获通道输出四路PWM信号并观察效果。

二,软硬件平台
硬件
沁恒官方评估版CH32V307-R1-1V0。

软件
MRS生成的空白工程。

三,程序编写
直接操作寄存器失败之后,参考沁恒的demo编写代码如下,期望效果输出4路中心对齐PWM信号,频率为1/2 CK_CNT,为7.2kHZ,占空比依次为20%,40%,60%,80%

void PWM_Init()
{
    GPIO_InitTypeDef GPIO_InitStructure={0};
    TIM_OCInitTypeDef TIM_OCInitStructure={0};
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure={0};

    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOE | RCC_APB2Periph_TIM1 | RCC_APB2Periph_AFIO, ENABLE );

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( GPIOE, &GPIO_InitStructure );
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_Init( GPIOE, &GPIO_InitStructure );
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    GPIO_Init( GPIOE, &GPIO_InitStructure );
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
    GPIO_Init( GPIOE, &GPIO_InitStructure );    //配置使用的IO

    GPIO_PinRemapConfig(GPIO_FullRemap_TIM1, ENABLE);    //重映射IO

    TIM_TimeBaseInitStructure.TIM_Period = 10000;
    TIM_TimeBaseInitStructure.TIM_Prescaler = 0;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
    TIM_TimeBaseInit( TIM1, &TIM_TimeBaseInitStructure);    //配置核心计数器工作模式


    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 5000;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init( TIM1, &TIM_OCInitStructure );
    TIM_OC2Init( TIM1, &TIM_OCInitStructure );
    TIM_OC3Init( TIM1, &TIM_OCInitStructure );
    TIM_OC4Init( TIM1, &TIM_OCInitStructure );       //配置比较输出通道

    TIM_CtrlPWMOutputs(TIM1, ENABLE );          //高级定时器置位MOE
    TIM_OC1PreloadConfig( TIM1, TIM_OCPreload_Disable );
    TIM_OC2PreloadConfig( TIM1, TIM_OCPreload_Disable );
    TIM_OC3PreloadConfig( TIM1, TIM_OCPreload_Disable );
    TIM_OC4PreloadConfig( TIM1, TIM_OCPreload_Disable );    //禁止ccr预装载


    TIM_ARRPreloadConfig( TIM1, ENABLE );           //开启核心计数器自动重装载


    TIM_Cmd( TIM1, ENABLE );       //开启核心计数器

}



int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    SystemCoreClockUpdate();
    Delay_Init();
    USART_Printf_Init(115200);   
    printf("SystemClk:%d\r\n",SystemCoreClock);
    printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
    printf("This is printf example\r\n");

    PWM_Init();
    TIM1->CH1CVR = 2000;
    TIM1->CH2CVR = 4000;
    TIM1->CH3CVR = 6000;
    TIM1->CH4CVR = 8000;

    while(1)
    {

    }
}

四,观察现象
使用逻辑分析仪观察到的信号如下



————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_44075145/article/details/129611359

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1931

主题

15650

帖子

12

粉丝