STM32F103/CH32F103定时器的单脉冲模式

1.什么是单脉冲模式

意思就是通过某种事件触发后,只是输出单个脉冲---单周期pwm信号。用于电机驱动,可控硅过零检测驱动,是比较理想的路径。

2.实现方式

本次讨论的外部触发信号,来输出单脉冲。上官图

废话不多说,上码:

void PWM_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
    
    TIM_ICInitTypeDef  TIM_ICInitStructure;
    
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE);


    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);    
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_Period = 10000-1;
    TIM_TimeBaseInitStructure.TIM_Prescaler = 72-1;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
    
        /* auto-reload preload enable */
    TIM_ARRPreloadConfig(TIM3,ENABLE);
    
///    
    
/* 配置定时器的输出比较 */    
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 5000-1;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
    TIM_OC1Init(TIM3,&TIM_OCInitStructure);
    TIM_OC3Init(TIM3,&TIM_OCInitStructure);
    TIM_OC4Init(TIM3,&TIM_OCInitStructure);
/* 配置定时器输入比较 */
 
  TIM_ICStructInit(&TIM_ICInitStructure);
 
  TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  TIM_ICInitStructure.TIM_ICFilter = 0;
 
  TIM_ICInit(TIM3, &TIM_ICInitStructure);

    
//    TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
//    TIM_SelectOnePulseMode(TIM3,TIM_OPMode_Single);//开启单脉冲模式 第二次调用SetCompare一直产生不了波形,初步怀疑这个函数产生了某个事件,没有清除,导致的。
//    TIM_Cmd(TIM3, ENABLE);  //使能TIM3

 /* 设置单脉冲模式 */
  TIM_SelectOnePulseMode(TIM3, TIM_OPMode_Single);
 
  /* 设置从模式触发输入 */
  TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);
 
  /* 设置从模式为触发模式 */
  TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);

}

其中,有朋友的代码中么有 TIM_ARRPreloadConfig(TIM3,ENABLE); 自动重载,导致输出脉宽是不对的,这里特别注意。

相互学习,不足之处恳请批正!

//

TIM_ARRPreloadConfig(TIM3,ENABLE);关于这个之前以为需要使能,但是深入研究发现,这个并不需要,因为模式使能为了触发模式。

那么导致作者输出脉冲不对的原因是什么?笔者用此方法是做一个可控硅过零触发的项目,经过深入研究发现,是定时器的频率设置导致的。理论上,市电频率为50HZ,双向可控硅触发,则触发的频率是50*2=100HZ(正负半周都需要触发),但是实际因为频率误差,以及过零触发的延迟(硬件电路限制),导致所能控制的可控硅的的时间小于市电的半周期0.01s,因此笔者将timer的频率设置比100hz更大,大于101hz,问题解决。

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先需要配置定时器的时钟源、预分频系数和计数器周期,然后根据需要设置占空比来生成 PWM 信号。下面是一个简单的示例代码,假设你要使用 TIM1_CH1(PA8) 输出 PWM 信号: ```c #include "stm32f10x.h" int main(void) { // 使能 TIM1 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); // 设置定时器 TIM1 的时钟源为系统时钟,预分频系数为 72-1,计数器周期为 1000-1 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Prescaler = 71; TIM_TimeBaseStructure.TIM_Period = 999; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); // 配置 TIM1_CH1(PA8) 为 PWM 模式,并设置初始占空比为 50% TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 500; // 占空比 50% TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM1, &TIM_OCInitStructure); // 使能 TIM1_CH1(PA8) TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable); // 启动定时器 TIM1 TIM_Cmd(TIM1, ENABLE); while (1) { // 在这里可以修改占空比,例如将占空比设置为 25% TIM_SetCompare1(TIM1, 250); // 占空比 25% } } ``` 在上面的代码中,首先需要使能 TIM1 的时钟,然后配置时钟源、预分频系数和计数器周期。接着,配置 TIM1_CH1(PA8) 为 PWM 模式,并设置初始占空比为 50%。最后,使能 TIM1_CH1(PA8) 和 TIM1,即可开始输出 PWM 信号。 在需要修改占空比的时候,可以使用 TIM_SetCompare1() 函数来设置 TIM1_CH1 的脉冲宽度,从而改变占空比。例如,将占空比设置为 25% 可以使用 TIM_SetCompare1(TIM1, 250) 函数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值