STM32输出固定数量的PWM脉冲

您所在的位置:网站首页 stm32发出正弦波 STM32输出固定数量的PWM脉冲

STM32输出固定数量的PWM脉冲

2024-06-16 17:53:36| 来源: 网络整理| 查看: 265

STM32输出固定数量的PWM脉冲

X_xxieRiemann关注

0.2122018.01.21 20:59:07字数 493阅读 8,743

主要程序参照CSDN上的文章《stm32主从模式定时器产生精确脉冲个数》进行修改,原文是以定时器4作为主模式输出PWM,定时器3作为从模式。在程序上测试后是可行的,只需要再加上定时器3的中断函数来关闭定时器使能即可。

由于项目需求,我这里是用高级定时器1作为主模式,高级定时器和通用定时器有一定的区别。 主要是下面两个设置不太相同:

TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //重复计数,一定要=0!!! TIM_CtrlPWMOutputs(TIM1, ENABLE); //高级定时器一定要加上,主输出使能

之前我没有加上TIM_CtrlPWMOutputs(TIM1, ENABLE)时程序一直没有输出波形,高级定时器中只有加这这句话才能有PWM输出。后来发现进入TIM2的中断函数的时机总是不对,比实际时间长很多,后来加上TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;后解决。

主定时器产生PWM

 

还有就是这里取的是ITR0。

/***定时器1主模式***/ void TIM1_config(u32 Cycle) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_TIM1 , ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //TIM1_CH4 PA11 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = Cycle-1; TIM_TimeBaseStructure.TIM_Prescaler =71; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS= Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //重复计数,一定要=0!!! TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_Pulse = Cycle/2-1; //设置待装入捕获寄存器的脉冲值 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性 TIM_OC4Init(TIM1, &TIM_OCInitStructure); TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable); TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update); TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM1, ENABLE); } /***定时器2从模式***/ void TIM2_config(u32 PulseNum) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseStructure.TIM_Period = PulseNum-1; TIM_TimeBaseStructure.TIM_Prescaler =0; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_SelectInputTrigger(TIM2, TIM_TS_ITR0); //TIM_InternalClockConfig(TIM3); TIM2->SMCR|=0x07; //设置从模式寄存器 //TIM_ITRxExternalClockConfig(TIM2, TIM_TS_ITR0); //TIM_ARRPreloadConfig(TIM3, ENABLE); TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE); // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void Pulse_output(u32 Cycle,u32 PulseNum) { TIM2_config(PulseNum); TIM_Cmd(TIM2, ENABLE); TIM_ClearITPendingBit(TIM2,TIM_IT_Update); TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); TIM1_config(Cycle); TIM_Cmd(TIM1, ENABLE); TIM_CtrlPWMOutputs(TIM1, ENABLE); //高级定时器一定要加上,主输出使能 } void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) // TIM_IT_CC1 { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清除中断标志位 TIM_CtrlPWMOutputs(TIM1, DISABLE); //主输出使能 TIM_Cmd(TIM1, DISABLE); // 关闭定时器 TIM_Cmd(TIM2, DISABLE); // 关闭定时器 TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE); } } #include "delay.h" #include "sys.h" #include "timer.h" int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); delay_init(); //延时函数初始化 uart_init(115200); //串口初始化为115200 Pulse_output(1000,8000);//1KHZ,8000个脉冲 while(1) { } }

在示波器上1k的波形大概8秒后波形消失,符合预期。

输出一定数量PWM脉冲, 主要有几种方法: 1.单脉冲法,需要一个脉冲中断一次,中断次数多,影响效率,而且能保证每次的脉冲连续性么? 2.另一定时器进行中断计数,与1一样,需要频繁中断; 3.用主从定时器门控方式,比较繁琐; 4.高级定时器T1、T8的重复计数方式,RCR计数中断,看手册好像这种方式最简单,能满足一部分人要求,缺点是寄存器只有8位,最多实现255个脉冲计数输出。

参考文章: (1)门控法 (2)http://www.openedv.com/posts/list/0/42117.htm (3)高级定时器RCR计数中断,未测试通过! (4)http://download.csdn.net/download/dreamharding/10168003



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭