基于CH32F203利用TIM1 同时输出4通道固定PWM占空比波形
📌相关篇《关于CH32F203程序下载方式说明》 📍有关CH32F203资料手册以及SDK资料:https://www.wch.cn/products/CH32F103.html
🌴《树莓派RP2040 100M 24通道逻辑分析仪开源项目》
✨虽然CH32F203和STM32F103重合度很高,但是在程序上有些外设还是不能兼容。外设的使用还是可以参考资料丰富的STM32来开发或学习使用。从对应提供的接口API函数来看,基本都是照搬的。
🔖本案例是基于官方提供SDK资料中的单路PWM输出例程中新增的多通道PWM输出。
🎈原案例:CH32F20xEVT\EVT\EXAM\TIM\PWM_Output
🎞4通道输出PWM波形 🎉使用RP2040开源的逻辑分析仪,使用免费上位机软件PulseView
参考pwm波形脉宽
📑多通道配置
✨如果想对每个通道单独进行初始化配置,可以将下面的函数分开来写。
void TIM1_PWMOut_Init ( u16 arr, u16 psc, u16 ccp)
{
GPIO_InitTypeDef GPIO_InitStructure = { 0 } ;
TIM_OCInitTypeDef TIM_OCInitStructure = { 0 } ;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure = { 0 } ;
RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE) ;
GPIO_InitStructure. GPIO_Pin = ( uint16_t ) ( GPIO_Pin_11 | GPIO_Pin_10 | GPIO_Pin_9| 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_OC2Init ( TIM1, & TIM_OCInitStructure) ;
TIM_OC3Init ( TIM1, & TIM_OCInitStructure) ;
TIM_OC4Init ( TIM1, & TIM_OCInitStructure) ;
TIM_CtrlPWMOutputs ( TIM1, ENABLE) ;
TIM_OC1PreloadConfig ( TIM1, TIM_OCPreload_Disable) ;
TIM_ARRPreloadConfig ( TIM1, ENABLE) ;
TIM_Cmd ( TIM1, ENABLE) ;
}
📝main主函数
🔰由于通道2在PA9引脚上,不能开启串口1,否则该引脚无法输出波形。
int main ( void )
{
TIM1_PWMOut_Init ( 1000 , 48 - 1 , 500 ) ;
TIM_SetCompare1 ( TIM1, 800 ) ;
TIM_SetCompare2 ( TIM1, 600 ) ;
TIM_SetCompare3 ( TIM1, 400 ) ;
TIM_SetCompare4 ( TIM1, 200 ) ;
while ( 1 ) ;
}
📓如果项通过其他定时器实现多通道PWM输出功能,原理一样可以照搬,如果想调节每一路的占空比输出,需要补充对应的函数以及关联变量即可实现。
📚程序源码
链接: https:
提取码: 4 s9d