本帖最后由 ttl_web 于 2019-4-6 12:47 编辑
- void PWM_TIM3_init(void)
- {
- GPIO_InitTypeDef g;
- TIM_TimeBaseInitTypeDef t;
- TIM_OCInitTypeDef o;
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |
- RCC_APB2Periph_AFIO,ENABLE);
-
- g.GPIO_Pin = GPIO_Pin_5;
- g.GPIO_Mode = GPIO_Mode_AF_PP;
- g.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB,&g);
-
- GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);
-
- t.TIM_Period = 200-1;
- t.TIM_Prescaler = 7200-1;
- t.TIM_ClockDivision = TIM_CKD_DIV4;
- t.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseInit(TIM3,&t);
-
- o.TIM_OCPolarity = TIM_OCPolarity_High; // 起始为高电平
- o.TIM_OCMode = TIM_OCMode_PWM1; // 当计数器小于设定时输出有效高电平
- o.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OC2Init(TIM3,&o);
-
- TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
- TIM_Cmd(TIM3,ENABLE);
- }
复制代码 以上可以产生周期为20ms的PWM,以下可以产生2ms高电平。通过采样,实际波形正确。- u16 val = 20; //如果是10,就产生1ms高电平
- TIM_SetCompare2(TIM3,val);
复制代码 实际需要对 1-2ms 的高电平进行细分,但以下代码只能分 10 格,
有没有方法进一步细分,比如100格或更大。
谢谢提点!!
STM32F103V
|
配合修改t.TIM_Period的值
和t.TIM_ClockDivision的分频比
应该可以达到要求
评分
查看全部评分
还有一种思路是考虑使用Systick,理论上来说,Systick的时间片应该是单片机的最小单位了,如果Systick都不行,外设肯定是不行的,除非有专用芯片。当然,还有一种野路子是通过配置PLL强行让MCU超频运行,也有可能提升进一步提升周期和占空比,不过意义不是很大,且对MCU稳定运行也存在潜在影响。
评分
查看全部评分
把T的计时时钟放小就可以了,如以1uS为时钟,1000uS一个周期,可进行1/1000细分调整呢
评分
查看全部评分