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;