资源描述:
《PWM发脉冲,怎么精确控制发脉冲的个数呢》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、STM32的PWM发送脉冲,周期和脉宽都可调了,但是现在不知道如何精确的控制所发的脉冲个数。具体要求就是在一段时间内大概50ms内发送5000-1W个脉冲 个数要很精确,误差2个以内可以接受该怎么控制呢?1.接上一个外部中断口,在中断中计数2.用一个定时器对发脉冲的时间进行控制各位大侠还有什么好的办法吗?求解啊!PWM溢出中断计数,是个不错的解决办法。如果一个上升沿算一个脉冲的话,控制周期(频率)不就行了开启PWM输出的溢出中断,进入一次中断,就是一个波原子哥 是这里吗?设置这个寄存器或者只是简单的定时器溢出中断oid TIM3
2、_IRQHandler(void){ if(TIM3->SR&0X0001)//溢出中断 { .... //计数 } TIM3->SR&=~(1<<0);//清除中断标志位}看我们开发板:定时器中断例程。你好 原子哥 中断计数的话 那怎么停止呢 还有停止了还想让他循环发送呢 有没有实现好的源程序呢 我是STM32F103控制输出方波的脉冲数和周期好多人遇到这个问题,额!现在我用了两种方法实现,感觉都不好! 方案1:定时器翻转IO,到达指定个数关闭TIM方案2:PWM,开启比较捕获
3、中断,到达指定个数关闭TIM感觉都是频繁进中断,占用大量CPU资源。不能做其他事了voidTIM4_GPIO_Config(void){ GPIO_InitTypeDefGPIO_InitStructure; /*TIM4clockenable*/ //PCLK1经过2倍频后作为TIM4的时钟源等于72MHz RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); NVIC_Configuration(1); /*GPIOBclockenable*/ RCC
4、_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB
5、RCC_APB2Periph_GPIOC,ENABLE); /*GPIOBConfiguration:TIM4channel1and2asalternatefunctionpush-pull*/ GPIO_InitStructure.GPIO_Pin= GPIO_Pin_6
6、GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出 GPIO_In
7、itStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_ResetBits(GPIOB,GPIO_Pin_6
8、GPIO_Pin_7);} voidTim2_Slave_Init(void){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_DeInit(TIM2); RCC_APB1PeriphClockCmd(RCC_APB1Periph_
9、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;//向上溢
10、出 TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure); TIM_SelectInputTrigger(TIM2,TIM_TS_ITR3);//选择TIM2的输入触发源 内部触发3 TIM4 TIM_InternalClockConfig(TIM2); TIM2->SMCR
11、= 0x0007;//设定从模式控制寄存器,外部时钟模式1上升沿驱动计数 //TIM_UpdateDisableConfig(TIM4,ENABLE); TIM_ARRP
12、reloadConfig(TIM2,ENABLE); TIM_ClearFlag(TIM2,TIM_FLAG_Update); //清除溢出中断标志 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); TIM_