在一些项目中,我们经常要控制PWM脉冲的频率和数量,比如步进电机的控制等,下面分享一个程序是关于这方面的,程序的思想就是通过STM32的定时器来输出PWM波,并开启定时器中断,在中断里面计数脉冲的数量,一旦脉冲数量达到了目标值,就关闭定时器,实现精确控制脉冲的数量。

  下面是程序分析:

  定时器4配置

  

#include"stm32f10x.h"
#include"pwm.h"
/*¶¨Ê±Æ÷4Êä³ö4·²»Í¬Õ¼¿Õ±ÈÂö³å
Ó²¼þÁ¬½ÓÈçÏÂ
CH1--PB6
CH2--PB7
CH3--PB8
CH4--PB9
*/
void PWM_Init(u16 arr,u16 psc)
{
u16 val1=arr/5;
/*u16 val2=arr/4;
u16 val3=arr/6;
u16 val4=arr/8;*/

GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

//ʱÖÓÅäÖÃ
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 ,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO ,ENABLE);

//¶Ë¿Ú³õʼ»¯
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);

//¶¨Ê±Æ÷4»ù±¾ÅäÖÃ
TIM_TimeBaseInitStructure.TIM_Period=arr;
TIM_TimeBaseInitStructure.TIM_Prescaler=psc;
TIM_TimeBaseInitStructure.TIM_ClockDivision=0;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);

//PWMģʽÅäÖÃ

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±È½ÏÊä³öʹÄÜ
TIM_OCInitStructure.TIM_Pulse = 0; //ÉèÖôý×°È벶»ñ±È½Ï¼Ä´æÆ÷µÄÂö³åÖµ
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ß
TIM_OC1Init(TIM4, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); //ʹÄÜTIMxÔÚCCR1ÉϵÄԤװÔؼĴæÆ÷

/*TIM_OCInitStructure.TIM_Pulse=val2;
TIM_OC2Init(TIM4,&TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable );

TIM_OCInitStructure.TIM_Pulse=val3;
TIM_OC3Init(TIM4,&TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable );

TIM_OCInitStructure.TIM_Pulse=val4;
TIM_OC4Init(TIM4,&TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable );*/

TIM_ARRPreloadConfig(TIM4, ENABLE);

TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);
TIM_ITConfig(TIM4,TIM_IT_CC1,ENABLE);

//TIM_Cmd(TIM4,ENABLE);

}
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

}

  主函数:

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "pwm.h"
#include "usart.h"
u32 step=0;
int main(void)
{
SystemInit();
uart_init(115200);
delay_init();
LED_Init();
NVIC_Config();
PWM_Init(719,100);
TIM_Cmd(TIM4,ENABLE);
while(1)
{

// delay_ms(100);
// LED1=!LED1;
// delay_ms(100);
TIM4->CCR1 = 300;

}
}
void TIM4_IRQHandler(void)
{
if(TIM_GetITStatus(TIM4,TIM_IT_CC1)!=RESET)
{
TIM_ClearITPendingBit(TIM4,TIM_IT_CC1);
step++;
printf("%d\r\n",step);
if(step==80000)
{
TIM_Cmd(TIM4,DISABLE);
}
}

}

以上就是完整程序。欢迎同学交流,改正。  

转载于:https://www.cnblogs.com/panlangen/p/7599901.html

精准控制PWM脉冲的频率和数量相关推荐

  1. STM32定时器间的同步 主TIM1产生PWM 从TIM4精确控制TIM1 PWM脉冲数量

    STM32 定时器间的同步 主TIM1产生PWM 从TIM4精确控制TIM1 PWM脉冲数量 文章目录 STM32 定时器间的同步 主TIM1产生PWM 从TIM4精确控制TIM1 PWM脉冲数量 编 ...

  2. STM32 同一定时器四路不同占空比PWM输出+舵机角度精准控制

    2019.3.25更新 pwm使用较为简单,但是对于精准控制,比如用于步进电机的控制和舵机控制,则要准确计算它的脉宽和占空比. 脉冲周期计算: PWM所使用的时钟频率f = 相应定时器频率 / (TI ...

  3. STM32控制步进电机:基于HAL库定时器中断的闭环步进电机驱动+精准控制脉冲数

    STM32控制步进电机:基于HAL库定时器中断的闭环步进电机驱动+精准控制脉冲数 一.步进电机闭环驱动器 二.CubeMx配置 1.Clock Configuration 2.脉冲端 定时器配置 3. ...

  4. 定时器主从模式实现PWM脉冲个数、占空比以及频率可调(250kHz以下)

    GPIO配置: void GPIO_config(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd( RCC_APB1 ...

  5. PWM调光频率0.1-20KHz以内,共阳极控制高辉无频闪LED车灯调光电源驱动芯片方案FP7125/FP7122/FP7123

    一:方案名称 PWM调光频率0.1-20KHz以内,共阳极控制高辉无频闪LED车灯调光电源驱动芯片方案FP7125/FP7122/FP7123 二:方案品牌 远翔FEELING(雅欣) 三:方案描述 ...

  6. 永磁同步电机PMSM直接转矩滞环控制 采用三闭环控制:转速外环采用PI调节器,转矩环和磁链环经过滞环后得到PWM脉冲

    永磁同步电机PMSM直接转矩滞环控制 Matlab/Simulink仿真模型(成品) 1.采用三闭环控制:转速外环采用PI调节器,转矩环和磁链环经过滞环后得到PWM脉冲 2.采用DTC直接转矩控制 3 ...

  7. 动态更改PWM波频率并输出一定数量PWM脉冲

    一,动态更改PWM波频率: 1,定时器时钟使能(主,从) 2,正常配置产生PWM波. 3,使能事件更新.TIM->CR1的UDIS=0 4,使能影子寄存器TIM->CR1的ARPE=1 这 ...

  8. 精准控制的开关电脉冲表征GST薄膜的相变行为(2121.8.29,cyy)

    标题:Characterization of phase-change behavior of a Ge2Sb2Te5 thin film using finely controlled electr ...

  9. 【嵌入式系统开发15】STM32F103C8T6下通过定时器Timer方式实现时间的精准控制,实现串口通信并让LED等周期性地闪烁

    本文目的是主要介绍通过STM32F103C8T6采用定时器Timer方式实现时间的精准控制,相当于给CPU上了一个闹钟,CPU平时处理其它任务,当定时时间到了以后,处理定时相关的任务.请设置一个5秒的 ...

最新文章

  1. 智能睡眠评估系统(包含:睡眠数据特征工程、睡眠评分、睡眠聚类、睡眠可视化分析、睡眠结论存储)
  2. iphone开发中的一些小技
  3. python3 xml 取标签显示内容_如何应用“XML+XSLT”技术分离Web表示层数据和样式
  4. 自己写的socket 多线程 通讯
  5. 纪念下数据路上遇到的贵人
  6. 模型越复杂越容易惰性_ML模型的惰性预测
  7. 软件测试不是一个功能
  8. python程序题斐波那契数列_Python编程题9--斐波那契数列
  9. PX4环境git submodule update --init --recursive失败的解决办法
  10. Error : Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so
  11. java文件转base64
  12. 数学建模论文写作模板
  13. AI-终极算法-遗传算法
  14. 系统讲解一下整站SEO优化都涉及到哪些工作?
  15. siri中文语音助理_针对“语音助手”类产品,浅谈对话式交互设计
  16. 1236: 数的逆转
  17. 将apk和所需库文件编译打包到system/priv-app路径下
  18. linux分析mirna,一篇15分的miRNA芯片文章详细解读 | 文章解读
  19. FPGA实现DDRIP核配置(Memory Interface Solutions)
  20. 谷歌浏览器开启并行下载

热门文章

  1. python使用方法-Python的使用方法
  2. python3.6.1安装教程-Linux下python3.6.1环境配置教程
  3. python语言百度百科-Python 语言下数据驱动DDT的应用
  4. python 装饰器 参数-[Python]写个带参数的装饰器
  5. python while循环语句-Python While 循环语句
  6. python画曲线-如何通过python画loss曲线的方法
  7. python基于什么语言-一种基于Python语言的EDA开发平台及其使用方法与流程
  8. python运行错误-Python在运行中发生错误怎么正确处理方法,案例详解!
  9. python菜鸟基础教程-Python3 面向对象
  10. python语言能干什么-python语言可以干什么