STM32F407输出多路PWM波

发布者:星际穿越最新更新时间:2018-06-28 来源: eefocus关键字:STM32F407  PWM波 手机看文章 扫描二维码
随时随地手机看文章

主控,淘宝黑色STM32F407板子

编译器  IAR

目标要求  输出四路PWM波

这里把写好的H和C文件给大家了,只需要在main里面简单的调用一下函数即可实现四路PWM的输出


在main里面加入


 PWM_Init();

 Updata_PWM_(20,200,500,600);


//即可得到2%,20%,50%,60%的PWM波



#include "PWM.h"

//  输出四路PWM波
//----------------------------2016/11/26--陈勃瑄
//  void PWM_Init(void)
//  void Updata_PWM_(float DC1,float DC2,float DC3,float DC4)
//----------------------------------------------
//  定时器:TIM4
//  输出频率:50MHz 
//  占空比   m/1000 x100%
//  自动重装载值 2000000
//  PWM管脚配置  B6~B9
void PWM_GPIO(void){
    GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_TIM4);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_TIM4);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_TIM4);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_TIM4);
}


// PWM 定时器配置
void Pwm_Init(unsigned long Frequency, uint16_t TimerPeriod, float DC1,float DC2,float DC3,float DC4)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  
  TIM_OCInitTypeDef  TIM_OCInitStructure;   
  uint16_t Channel1Pulse = 0,Channel2Pulse = 0,Channel3Pulse = 0,Channel4Pulse = 0;
    //((1+0 )/(60*1000000))*(1+TimerPeriod )=1/f
  //TimerPeriod = (120*1000000 / (Frequency*8)) - 1; 
  Channel1Pulse = (uint16_t) (((uint32_t) DC1 * (TimerPeriod - 1)) / 1000);   
  Channel2Pulse = (uint16_t) (((uint32_t) DC2 * (TimerPeriod - 1)) / 1000); 
  Channel3Pulse = (uint16_t) (((uint32_t) DC3 * (TimerPeriod - 1)) / 1000);   
  Channel4Pulse = (uint16_t) (((uint32_t) DC4 * (TimerPeriod - 1)) / 1000);
  
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 , ENABLE);     
  
  /* Time Base configuration */  
  TIM_TimeBaseStructure.TIM_Prescaler = (84*1000000)/(TimerPeriod*Frequency)-1;     //// 时钟预分频数
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  ////向上计数
  TIM_TimeBaseStructure.TIM_Period = TimerPeriod;    // 自动重装载寄存器的值
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;  
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;   ////重复寄存器,用于自动更新pwm占空比          
  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);  
  
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;  
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;    ////使能该通道输出

  //第五步,死区和刹车功能配置,高级定时器才有的,通用定时器不用配置
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;    // //设置互补端输出极性
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;  ////使能互补端输出
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;   // //死区后输出状态??
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;  //死区后互补端输出状态??
  /* TIM1 counter enable */  
  TIM_OCInitStructure.TIM_Pulse = Channel1Pulse;    // //设置占空比时间
  TIM_OC1Init(TIM4, &TIM_OCInitStructure);
  TIM_OCInitStructure.TIM_Pulse = Channel2Pulse;    // //设置占空比时间
  TIM_OC2Init(TIM4, &TIM_OCInitStructure);
  TIM_OCInitStructure.TIM_Pulse = Channel3Pulse;    // //设置占空比时间
  TIM_OC3Init(TIM4, &TIM_OCInitStructure);
  TIM_OCInitStructure.TIM_Pulse = Channel4Pulse;    // //设置占空比时间
  TIM_OC4Init(TIM4, &TIM_OCInitStructure);
  
  TIM_Cmd(TIM4, ENABLE); 
  /* TIM1 Main Output Enable */  
  TIM_CtrlPWMOutputs(TIM4, ENABLE);  
}


//PWM占空比设置
void UpdataDuty(unsigned long Frequency,uint16_t TimerPeriod,float DC1,float DC2,float DC3,float DC4)  
{  
  TIM4->CCR1 =(int)(DC1*(TimerPeriod - 1) / 1000);
  TIM4->CCR2 =(int)(DC2*(TimerPeriod - 1) / 1000);
  TIM4->CCR3 =(int)(DC3*(TimerPeriod - 1) / 1000);
  TIM4->CCR4 =(int)(DC4*(TimerPeriod - 1) / 1000);
}
//PWM初始化
void PWM_Init(void)
{
  PWM_GPIO();
  Pwm_Init(50,1000,0,0,0,0);
}
//PWM占空比设置
void Updata_PWM_(float DC1,float DC2,float DC3,float DC4)
{
  UpdataDuty(50,1000,DC1,DC2,DC3,DC4);
}
#ifdef __cplusplus
extern "C" {
#endif
//.......................................
  
#include "stm32f4xx.h"



void PWM_Init(void);
void Updata_PWM_(float DC1,float DC2,float DC3,float DC4);
//.......................................
#endif


关键字:STM32F407  PWM波 引用地址:STM32F407输出多路PWM波

上一篇:分享PWM输入模式捕捉4路PWM波形的周期和占空比
下一篇:STM32F407的定时器1之7路PWM输出

推荐阅读最新更新时间:2024-03-16 16:07

stm32f407之CAN控制器(操作寄存器)
首先简单介绍一下CAN总线,关于CAN总线是谁发明的,CAN总线的历史,CAN总线的发展,CAN总线的应用场合,这些,通通不说。这里只是以我个人理解,简单说说CAN通信。CAN总线的端点没有地址(除非自己在帧里定义地址),CAN总线通信不用地址,用标识符,不是单独的谁发给谁,而是,你总是发送给整个网络。然后每个节点都有过滤器,对网络上的传播的帧的标识符进行过滤,自己想要什么样的帧,可以设置自己的过滤器,接收相关的帧信息。如果两个节点同时发送怎么办?这个不用我们担心,CAN控制器会自己仲裁,让高优先级的帧先发。 然后我们可以了解一下stm32的CAN控制器。 如上图所示,stm32有两个can控制器,can1(主),和can
[单片机]
<font color='red'>stm32f407</font>之CAN控制器(操作寄存器)
死磕到底2—STM32F407驱动无FIFO无时钟ov7670
上次的F103驱动OV7670究竟没有实用价值,我又买了一块STM32F407开发小板, 驱动了无FIFO无时钟ov7670,320*240每秒28帧(应该还可以快点)。 感觉到这个方案比用有FIFO的划算,STM32F407开发小板+ov7670=60元左右。 一、407带摄像头接口,取摄像头数据由片内硬件操作,超爽。 二、我用示波器看PA8输出时钟,幅度很小,这不是程序问题,是示波器频率不够, 调试时候不要怀疑这个信号。我在这里白白纠结了几天。 三、摄像头相关的口线比较多,一根口线多处设置,还有硬件连接的问题,容易出错。 调式时候可以一步一步来,先调SCCB,把摄像头初始化搞OK,再调直接读取图像数据,这样
[单片机]
STM32F407 Hal库 串口使用指南
首先,当然是在Cube中进行相应的配置,这个就不多讲了。 之后,在生成的工程中,找到main函数,在/* USER CODE BEGIN 2 */下加入 HAL_UART_Receive_IT(&huart1,Uart1_Data_buffer,n); 这是要给接收到的数据定向,存在Uart_Data_buffer 中。上面函数的第三个参数应该是收到n个字节就触发中断。 然后,在stm32f4xx_it.c的最后面,也就是/* USER CODE BEGIN 1 */下编写 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { 。。。
[单片机]
STM32F407的GPIO设置流程、和相关寄存器的理解及总结
GPIO设置流程 void LED_Init(void) { //1.定义结构体变量 GPIO_InitTypeDef GPIO_InitStructure; //2.使能GPIOF端口的时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //3.结构体成员初始化设置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//选择GPIOF引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式 (模式寄存器) GPIO_
[单片机]
<font color='red'>STM32F407</font>的GPIO设置流程、和相关寄存器的理解及总结
stm32f407时钟系统
IWDG:内部32kHz RTC:内部32kHz、外部32.768kHz、HSE8Mhz分频 PLL配置:M=8,N=336,P=2,Q=7. SYSCLK选用PLL倍频的P,PLLCLK输出168Mhz AHB PRESC不分频输出168Mhz APB1 4分频为42Mhz APB1定时器84Mhz APB2 2分频为84Mhz APB2定时器168Mhz
[单片机]
<font color='red'>stm32f407</font>时钟系统
stm32f407之外部中断使用流程
1.初始化 1.初始化相关结构体 NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; 2.打开SYSCFG SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); 3.配置EXTI EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrup
[单片机]
STC12C5A60S2的PCA模块输出PWM
PCA是一个模块,是一个硬件结构,具体的如下图所示 16位PCA定时器/计数器相当于定时器0/1。每经过一个时钟周期会自动加1,时钟周期来源与下图几部分: 一个时钟周期可能为(SYSclk/1,SYSclk/2...),最后一个外部输入指的是给他外接的晶振源。 模块0/1是十六位的捕获/比较模块。这个模块的工作方式有四种: 1、上升/下降沿捕获 2、软件定时器 3、高速脉冲输出 4、克调制脉冲输出 至于要在哪一个模式下工作,可以通过配置寄存器来进行完成 在手册中有一个配置表格,我们按自己的要求来进行选择即可。例如我们选择 8位PWM,无中断模式 这是最简单的模式,去掉那些烦人的中断,对了虽然PC
[单片机]
STC12C5A60S2的PCA模块输出<font color='red'>PWM</font><font color='red'>波</font>
stm32f407】硬件介绍
1.样板模样 2.特性 STM32F407系列面向需要在小至10 x 10 mm的封装内实现高集成度、高性能、嵌入式存储器和外设的医疗、工业与消费类应用。 STM32F407提供了工作频率为168 MHz的Cortex™-M4内核(具有浮点单元)的性能。 性能:在168 MHz频率下,从Flash存储器执行时,STM32F407能够提供210 DMIPS/566 CoreMark性能,并且利用意法半导体的ART加速器实现了FLASH零等待状态。DSP指令和浮点单元扩大了产品的应用范围。 功效:该系列产品采用意法半导体90 nm工艺和ART加速器,具有动态功耗调整功能,能够在运行模式下和从Flash存储器执行时实现
[单片机]
【<font color='red'>stm32f407</font>】硬件介绍
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved