PWM发脉冲,怎么精确控制发脉冲的个数呢分析 下载本文

内容发布更新时间 : 2025/1/11 1:26:30星期一 下面是文章的全部内容请认真阅读。

STM32的PWM发送脉冲,周期和脉宽都可调了,但是现在不知道如何精确的控制所发的脉冲个数。

具体要求就是在一段时间内大概50ms内发送5000-1W个脉冲 个数要很精确,误差2个以内可以接受 该怎么控制呢?

1.接上一个外部中断口,在中断中计数 2.用一个定时器 对发脉冲的时间进行控制

各位大侠还有什么好的办法吗?求解啊!

PWM溢出中断计数,是个不错的解决办法。

如果一个上升沿算一个脉冲的话,控制周期(频率)不就行了

开启PWM输出的溢出中断,进入一次中断,就是一个波

原子哥 是这里吗? 设置这个寄存器

或者只是简单的定时器溢出中断 oid TIM3_IRQHandler(void) {

if(TIM3->SR&0X0001)//溢出中断

{

.... //计数 }

TIM3->SR&=~(1<<0);//清除中断标志位 }

看我们开发板:定时器中断例程。

你好 原子哥 中断计数的话 那怎么停止呢 还有停止了还想让他循环发送呢 有没有实现好的源程序呢 我是STM32F103

控制输出方波的脉冲数和周期

好多人遇到这个问题,额!

现在我用了两种方法实现,感觉都不好!

方案1:定时器翻转IO,到达指定个数关闭TIM

方案2:PWM,开启比较捕获中断,到达指定个数关闭TIM

感觉都是频繁进中断,占用大量CPU资源。不能做其他事了 void TIM4_GPIO_Config(void) {

GPIO_InitTypeDef GPIO_InitStructure;

/* TIM4 clock enable */

//PCLK1经过2倍频后作为TIM4的时钟源等于72MHz RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); NVIC_Configuration(1);

/* GPIOB clock enable */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);

/*GPIOB Configuration: TIM4 channel 1 and 2 as alternate function push-pull */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode =

GPIO_Mode_AF_PP; // 复用推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_ResetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); }

void Tim2_Slave_Init(void) {

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_DeInit(TIM2);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); NVIC_Configuration(8);

TIM_TimeBaseStructure.TIM_Period= XBUF[1] - 1; TIM_TimeBaseStructure.TIM_Prescaler= 0; //时钟预分频数

TIM_TimeBaseStructure.TIM_ClockDivision=0; //采样分频

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上溢出

TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

TIM_SelectInputTrigger(TIM2,TIM_TS_ITR3);//选择TIM2的输入触发源 内部触发3 TIM4

TIM_InternalClockConfig(TIM2);

TIM2->SMCR |= 0x0007;//设定从模式控制寄存器,外部时钟模式1 上升沿驱动计数

//TIM_UpdateDisableConfig(TIM4,ENABLE); TIM_ARRPreloadConfig(TIM2, ENABLE);

TIM_ClearFlag(TIM2,TIM_FLAG_Update); //清除溢出中断标志 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

TIM_Cmd(TIM2,ENABLE);//是否开启时钟(开启后每发送一个脉冲,定时器加一) }

void Tim3_Slave_Init(void) {

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_DeInit(TIM3);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); NVIC_Configuration(9);

TIM_TimeBaseStructure.TIM_Period= XBUF[3] - 1;