【RISC-V MCU CH32V103测评】PWM测试
[复制链接]
CH32V103带有PWM输出功能,PWM输出功能在单机控制等应用中十分重要。但是实验结果让我很困惑。
参考例程C:\CH32V103EVT\EVT\EXAM\TIM\PWM_Output的内容,新建了一个项目TIM_PWM
主要初始化程序:
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请参考下图
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
这是我测试的结果:
看到默认参数的PWM的脉宽为50%的占空比的波形,频率为15HZ!
为什么呀?48M的主频,47999个脉冲计数时钟
1K的基础时钟,100的计数值,1/1000*100 = 0.1s的周期,怎么是15HZ,有明白的同行给解释一下了
|