366|0

1459

帖子

2

资源

纯净的硅(高级)

【RISC-V MCU CH32V103测评】PWM测试 [复制链接]

CH32V103带有PWM输出功能,PWM输出功能在单机控制等应用中十分重要。但是实验结果让我很困惑。

参考例程C:\CH32V103EVT\EVT\EXAM\TIM\PWM_Output的内容,新建了一个项目TIM_PWM

主要初始化程序:

/*******************************************************************************
* Function Name  : TIM1_PWMOut_Init
* Description    : Initializes TIM1 PWM output.
* Input          : arr: the period value.
*                  psc: the prescaler value.
*                  ccp: the pulse value.
* Return         : None
*******************************************************************************/
void TIM1_PWMOut_Init( u16 arr, u16 psc, u16 ccp )
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE );

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    TIM_TimeBaseInitStructure.TIM_Period = arr;
    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit( TIM1, &TIM_TimeBaseInitStructure);

#if (PWM_MODE == PWM_MODE1)
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

#elif (PWM_MODE == PWM_MODE2)
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;

#endif

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = ccp;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init( TIM1, &TIM_OCInitStructure );

    TIM_CtrlPWMOutputs(TIM1, ENABLE );
    TIM_OC1PreloadConfig( TIM1, TIM_OCPreload_Disable );
    TIM_ARRPreloadConfig( TIM1, ENABLE );
    TIM_Cmd( TIM1, ENABLE );
}

程序中我加入了两只LED用来做程序指示,然后是PWM主角PA8,这些引脚都被设置为强上拉输出模式。

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

引脚的时钟是50MHZ,我不理解的是:我都把引脚设成PWM了或是什么其它的功能,你说这个时钟有什么用呢?

然后是定时器TIM1的设置,如果不知道为什么是TIM1请参考下图

image.png TIM1在总线APB2上,PA8默认功能是TIM1_CH1(时钟TIM1的通道CH1),程序中选定了引脚PA8就确定了初始化参数。

TIM1_PWMOut_Init(100, 48000-1, 50 );的三个参数,分别是

                  arr: the period value.  //计数基数
                  psc: the prescaler value. //分频系数
                  ccp: the pulse value. //占空比

分频系数:48000-1,也就是1KHZ的计数基频,因为48MHZ的频率,每47999个脉冲计数翻转一次。

计数基数:这个是定时器的计数长度(计数基频的数量),注意:计数方向向上。

占空比:输出脉冲的计数时长。要小于计数基数的值,占空比 = ccp/psc

image.png 这是我测试的结果:

 

IMG_1415.JPG 看到默认参数的PWM的脉宽为50%的占空比的波形,频率为15HZ!

为什么呀?48M的主频,47999个脉冲计数时钟

1K的基础时钟,100的计数值,1/1000*100 = 0.1s的周期,怎么是15HZ,有明白的同行给解释一下了

 

 

 

 

赞赏

1

查看全部赞赏


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

最新文章 更多>>
    关闭
    站长推荐上一条 1/6 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表