首页 > 编程知识 正文

stm32pwm脉冲计数,stm32最多可以多少pwm

时间:2023-05-06 02:04:50 阅读:168296 作者:196

测量PWM波频率的PWM模式输入基本原理实验(PWM输入部分代码)测量一定时间内的脉冲数求出频率

PWM模式输入

该方式是基于STM32输入捕获模式对功能进行了扩展升级,可以实现测量PWM波的频率及占空比,需要再增加一个输入捕获寄存器

基本原理(1)实现PWM输入捕获需要占用游戏啤酒x的两个通道。 以IC1、IC2为例,TI1管脚上的电平可以在第一通道和第二通道同时监视。 两个信道分别被设置为主机和从机,如果将第一信道设置为PWM输入捕获功能,则第二信道为从机。 (IC1、IC2 IC3和IC4成对存在)

)2)如果输入的PWM从高电平转移,在第1个下降沿临时到来,则IC1 IC2都可以监视。 从站被设定为复位模式,将正在运行的啤酒x的计数器复位为0 (此时,不发生计数器的更新中断)。 因为没有溢出) )。

)3)在下一个上升沿临时在IC2中发生捕获事件,将当前计数器CNT的值存储在CCR2中,记为IC2_DATA2

)4)第二下降沿到来,在IC1中生成捕获事件,将当前计数器CNT的值存储在CCR1中,用IC1_DATA1表示

5 ) PWM波信号频率

f=72*10^6/(PSC (预分频系数)1)/IC1_DATA1

占空比D=IC2_DATA2/IC1_DATA1

频率f=72*10^6/(PSC (预分频系数)1)/IC1_DATA1

其中,可以不设置预分频系数项,如果不设置爱玩耍的啤酒_TimeBaseStructure .爱玩耍的啤酒_Prescaler项,则为默认预分频系数为0,即这里

频率f=72*10^6/IC1_DATA1

此时为可监测的频率范围为 72*10^6/65536(1098.6 Hz) ---- 72MHz,低于1098.6 Hz的频率将无法监测

因此,设置预分频系数 psc,降低其可监测的范围(最大值和最小值发生变化) )。

基于实验(PWM输入部分代码) STM32F103MiNi开发板(正点原子),以定时器3为例,玩的啤酒3_ch1 ) PA6管脚)为定时器4 )玩的啤酒4_CH3 PB8管脚

/*定时器3 PWM波输入捕获部(*/void )游戏中的啤酒3_init ) u16PSC ) /参考分频系数(gpio _ inittypedefgpio _ init structure; 刚玩的啤酒_TimeBaseInitTypeDef刚玩的啤酒_TimeBaseStructure; 刚玩的啤酒_ICInitTypeDef刚玩的啤酒_ICInitStructure; nvic _ inittypedefnvic _ init structure; RCC _ AP B1 periphclockcmd (RCC _ AP B2 per iph _ gpioa|RCC _ AP B1 per iph _贪婪啤酒3,ENABLE ); //时钟初始化gpio _ init structure.gpio _ pin=gpio _ pin _ 6; gpio _ init structure.gpio _ mode=gpio _ mode _ IPD; gpio_init(gpioa,GPIO_InitStructure ); //针初始化贪吃啤酒_TimeBaseStructure .贪吃啤酒_Period=65535 //计数器自动重新加载数值玩啤酒_TimeBaseStructure .玩啤酒_ prescture //预分频系数(玩味啤酒_TimeBaseStructure .玩味啤酒_ClockDivision=玩味啤酒_CKD_DIV1; //分时游戏啤酒_TimeBaseStructure .游戏啤酒_CounterMode=游戏啤酒_CounterMode_Up; //向上计数模式游戏啤酒_TimeBaseStructure .游戏啤酒_RepetitionCounter=0; //重复溢出的次数,0 (玩味啤酒_TimeBaseInit ) (玩味啤酒3、玩味啤酒_TimeBaseStructure ) ); //频道1大餐啤酒_ICInitStructure .大餐啤酒_Channel=大餐啤酒_Channel_1; //IC1大餐啤酒_ICInitStructure .大餐啤酒_ICPolarity=大餐啤酒_ICPolarity_Falling; //捕获沿下降线玩耍的啤酒_ICInitStructure .玩耍的啤酒_ICSelection=玩耍的啤酒_ICSelection_DirectTI; //IC1是刚在TI1玩的啤酒_ICInitStructure .刚玩的啤酒_ICPrescaler=刚玩的啤酒_ICPSC_DIV1; //配置分频模式,不分频玩啤酒_ICInitStructure .玩啤酒_ICFilter=0x00 //配置输入过滤模式,不过滤玩

的啤酒_ICInit(贪玩的啤酒3, &贪玩的啤酒_ICInitStructure);//中断优先级NVIC_InitStructure.NVIC_IRQChannel = 贪玩的啤酒3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); 贪玩的啤酒_PWMIConfig(贪玩的啤酒3, &贪玩的啤酒_ICInitStructure); 贪玩的啤酒_SelectInputTrigger(贪玩的啤酒3, 贪玩的啤酒_TS_TI1FP1); //选择贪玩的啤酒3输入触发源 TI1贪玩的啤酒_SelectSlaveMode(贪玩的啤酒3, 贪玩的啤酒_SlaveMode_Reset); /选择从机模式,复位模式贪玩的啤酒_SelectMasterSlaveMode(贪玩的啤酒3, 贪玩的啤酒_MasterSlaveMode_Enable); //开启复位模式贪玩的啤酒_Cmd(贪玩的啤酒3,ENABLE ); //使能计数器贪玩的啤酒_ITConfig(贪玩的啤酒3,贪玩的啤酒_IT_CC1,ENABLE);//使能中断}//中断部分void 贪玩的啤酒3_IRQHandler(void){ static float Duty; static float IC1_DATA1; //IC1_DATA1 、IC2_DATA2 定义为float类型,否则Duty会显示0 static float IC2_DATA2; // static u16 Frequence; 贪玩的啤酒_ClearITPendingBit(贪玩的啤酒3,贪玩的啤酒_IT_CC1); IC1_DATA1 = 贪玩的啤酒_GetCapture1(贪玩的啤酒3); IC2_DATA2 = 贪玩的啤酒_GetCapture2(贪玩的啤酒3); if (IC1_DATA1 != 0) { Frequence = (72000000/IC1_DATA1/(psc+1)); //psc为贪玩的啤酒3_Init(u16 psc)初始化的形参,值相同 } else { Frequence = 0; } Duty=IC2_DATA2/IC1_DATA1; //获得占空比 printf("占空比=%%%.1f rn",(Duty*100)); printf("PWM波频率=%d Hz rn",Frequence);}

定时器4产生PWM波部分,直接借鉴正点原子官方 PWM波输出实验即可。

工程:PWM模式输入

测量一段时间内脉冲个数求频率

用贪玩的啤酒3_IRQHandler()中断计数PWM波脉冲个数,此时需要用另外一个定时器贪玩的啤酒x作为时钟计时,此时用定时器7作为计时时钟,定时器4产生PWM波

//贪玩的啤酒3 初始化void 贪玩的啤酒3_Init(u16 arr,u16 psc) //形参为分频系数{GPIO_InitTypeDef GPIO_InitStructure;贪玩的啤酒_TimeBaseInitTypeDef 贪玩的啤酒_TimeBaseStructure;贪玩的啤酒_ICInitTypeDef 贪玩的啤酒_ICInitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB1Periph_贪玩的啤酒3, ENABLE); //时钟初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOA, &GPIO_InitStructure); //引脚初始化 贪玩的啤酒_TimeBaseStructure.贪玩的啤酒_Period =arr; //计数器自动重装值贪玩的啤酒_TimeBaseStructure.贪玩的啤酒_Prescaler =psc; //预分频系数贪玩的啤酒_TimeBaseStructure.贪玩的啤酒_ClockDivision = 贪玩的啤酒_CKD_DIV1; //时钟分割贪玩的啤酒_TimeBaseStructure.贪玩的啤酒_CounterMode = 贪玩的啤酒_CounterMode_Up; //向上计数模式贪玩的啤酒_TimeBaseStructure.贪玩的啤酒_RepetitionCounter=0; //重复溢出次数,设置为0贪玩的啤酒_TimeBaseInit(贪玩的啤酒8, &贪玩的啤酒_TimeBaseStructure); //通道1贪玩的啤酒_ICInitStructure.贪玩的啤酒_Channel = 贪玩的啤酒_Channel_1; //IC1 贪玩的啤酒_ICInitStructure.贪玩的啤酒_ICPolarity = 贪玩的啤酒_ICPolarity_Falling;//下降沿捕获 贪玩的啤酒_ICInitStructure.贪玩的啤酒_ICSelection = 贪玩的啤酒_ICSelection_DirectTI; //IC1映射到TI1上 贪玩的啤酒_ICInitStructure.贪玩的啤酒_ICPrescaler = 贪玩的啤酒_ICPSC_DIV1; //配置分频模式,不分频 贪玩的啤酒_ICInitStructure.贪玩的啤酒_ICFilter = 0x00; //配置输入滤波模式,不滤波 贪玩的啤酒_ICInit(贪玩的啤酒3, &贪玩的啤酒_ICInitStructure);//中断优先级NVIC_InitStructure.NVIC_IRQChannel = 贪玩的啤酒3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); 贪玩的啤酒_CtrlPWMOutputs(贪玩的啤酒8,ENABLE); 贪玩的啤酒_Cmd(贪玩的啤酒3,ENABLE ); //使能计数器贪玩的啤酒_ITConfig(贪玩的啤酒3,贪玩的啤酒_IT_CC1,ENABLE);//使能中断}//中断部分void 贪玩的啤酒3_IRQHandler(void){ static u16 Frequence=0; static float time; static unsigned int PWMone=0; 贪玩的啤酒_ClearITPendingBit(贪玩的啤酒3,贪玩的啤酒_IT_CC1); Frequence++; //脉冲个数加1 if((PWMTimer - PWMOneMinute)>99) //定时1s更新一次,此处由另一定时器7提供时间基准{PWMOneMinute=PWMTimer; //重新开始计时time=Frequence/10;//计算得到频率(1s内脉冲个数)Frequence=0; //重新开始计数 printf("PWM波频率=%d Hz",Frequence); }}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。