STM32中PWM外设的原理,使用与配置

发布者:Yuexiang最新更新时间:2018-07-01 来源: eefocus关键字:STM32  PWM外设 手机看文章 扫描二维码
随时随地手机看文章

至于什么是PWM,百度即可,其实内容简单。 首先STM32中PWM功能是使用计数器实现的,与51里相似,但也有区别。51使用计数器的中断调节占空比,占用MCU的时间。而STM32使用硬件实现PWM的功能,故PWM属于外设功能。(计数器的向上计数,向下计数,中央对齐模式不介绍了)。

PWM主要对2个寄存器的配置。TIMx_ARR = T (设置周期T,频率的设置)

     TIMx_CCRx = t(设置占空比,这个一条库函数就行了)

**附:PWM仍进入挂接的TIMx的中断操作。不过51中断是中断作为一小份进入中断再计数进行pwm调制。而STM32是到ti则进入,已经调制好


  #include "PWM.h"


void PWM_init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
GPIO_InitTypeDef GPIO_InitStructure;              
TIM_OCInitTypeDef TIM_OCInitStructure;             

//挂接时钟RCC上

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);  
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);  

/* 定时器的配置*/

TIM_TimeBaseStructure.TIM_Period =900 ;                 //设置定时器频率           
TIM_TimeBaseStructure.TIM_Prescaler = 0;                //不分频 
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;     //向上计数    
TIM_TimeBaseInit(TIM3, & TIM_TimeBaseStructure); 

TIM_Cmd(TIM3, ENABLE);                          

/* PWM配置*/
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;   
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;      
TIM_OC2Init(TIM3, &TIM_OCInitStructure);                   
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);           

GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);           //指定管脚的映射,这个配置的pwm映射到TIM3上 

/* 配置pwm对led进行亮度的调节,故配置led的GPIO*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;        
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                    //推挽复用功能,pwm控制led,不是MCU就不用GPIO_Mode_Out_PP
GPIO_Init(GPIOC,&GPIO_InitStructure);            

}

中断文件里使用的函数

void EXTI2_IRQHandler(void)        //这里外部中断作为调制pwm的ti(占空比)使用
{
if(EXTI_GetITStatus(EXTI_Line2)==SET)                //判断是否进入外部中断2
{
EXTI_ClearITPendingBit(EXTI_Line2);     // 清除线路EXIT的挂起
delay_ms(10);                                                //
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET)       //读取key_up是否按下
{
if(ti<500)
ti=ti+100;
else 
ti=0;                                 //按键增加占空比
 }
while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0);   //没错,这里就是松开判断
}
}


void  TIM3_IRQHandler(void)        //到了ti则进入中断,给led一定占空比的高电平
{
static u8 i=0;
       TIM_ClearITPendingBit(TIM3,TIM_IT_Update);                //清空中断源
GPIO_Write(GPIOC,(u16)~(0x01<if(i==8) i=0;
}


main.c    主函数就简单了

#include "public.h"
#include "Systick.h"
#include "PWM.h"
#include "ExInter.h"

int main()

{

PWM_init();
ExInter_init();
 while(1)
{
delay_ms(10);
TIM_SetCompare2(TIM3,ti); //挂接通道2,
}  

}

说实在的,将理解写在注释里是多好的习惯。


关键字:STM32  PWM外设 引用地址:STM32中PWM外设的原理,使用与配置

上一篇:stm32通过IO口模拟输出多路pwm
下一篇:stm32f103 timer1产生400HzPWM

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

STM32中断管理函数
CM3 内核支持256 个中断,其中包含了16 个内核中断和240 个外部中断,并且具有256 级的可编程中断设置。但STM32 并没有使用CM3 内核的全部东西,而是只用了它的一部分。 STM32 有76 个中断,包括16 个内核中断和60 个可屏蔽中断,具有16 级可编程的中断优先级。 而我们常用的就是这60 个可屏蔽中断,所以我们就只针对这60 个可屏蔽中断进行介绍。 在 MDK 内,与NVIC 相关的寄存器,MDK 为其定义了如下的结构体: typedef struct { vu32 ISER ; u32 RESERVED0 ; vu32 ICER ; u32 RSERVED1 ; vu32 ISPR ; u32 RESER
[单片机]
STM32高级定时器1控制伺服直流电机
简介:使用STM32也有很多年了,现在毕业临近了,就想写写,做做记录也希望能帮助到可以帮助的人。STM32定时器有很多的用途,我也不一一举例,我最常用的就是输出PWM,定时器,输入捕获以及编码盘模式等等。 第一 : 用STM32高级定时器1控制伺服直流电机 /////////////////////////////////////////// //定时器1PWM初始化 共4路可变掌控比///////// //输入参数PWM1/2/3/4掌控比参数30000-60000// ////////////////////////////////////////// void TIM1_PWM(unsigned in
[单片机]
STM32 TIMx 配置
固件库 V3.5 IAR void NVIC_Configuration(void) { /***********************定时器2中断**********************************/ NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//使能或者失能指定的 IRQ通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;//设置了成员 NVIC_IRQChannel中的先占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority =
[单片机]
STM32直接驱动RGB接口的TFT数字彩屏
引言 随着工业技术的不断发展,人机界面的开发及应用空前火热,为了具有比较友好的人机界面,TFT数字彩屏被广泛的应用,但是TFT彩屏通常都不带有控制器,所以现在驱动彩屏的方案大致有2种: ①采用ARM9或者更高级别的平台,芯片上带有TFT控制器,可以直接挂接TFT数字屏。 ②采用低端CPU处理器平台,外加TFT控制器模块,再挂接TFT数字屏。 对于方案①来说,系统的复杂度会莫名地增加,再加上该类的平台中主MCU多为BGA封装,对于需求很多小量多样化产品的客户来说,较难以接受这样的方案;而 ②方案平白无故添加了一个LCD控制器。这两种方案无论哪一种都增加了硬件成本,本文提出了一种由STM32的FSMC总线直接挂载RGB接口屏的方案,直
[单片机]
<font color='red'>STM32</font>直接驱动RGB接口的TFT数字彩屏
STM32中GPIO工作模式
在Cortex-M3里,对于GPIO的配置种类有8种: (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉输入 (5)GPIO_Mode_Out_OD 开漏输出 (6)GPIO_Mode_Out_PP 推挽输出 (7)GPIO_Mode_AF_OD 复用开漏输出 (8)GPIO_Mode_AF_PP 复用推挽输出 I/O端口位的基本结构 1、推挽输出 推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有
[单片机]
<font color='red'>STM32</font>中GPIO工作模式
stm32 定时器重映射
void TIM3_GPIOB5_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE); GPIO_AFIODeInit(); //将重映射恢复为初始值 //在程序中只可以调用一次,不然之前的设置就取消了 GPIO_PinRemapConfig(GPIO_Par ti alRemap
[单片机]
STM32笔记(三)ADC、DMA、USART的综合练习
  我们在这里设置ADC为连续转换模式,常规转换序列中有两路转换通道,分别是ADC_CH10(PC0)和ADC_CH16(片内温度传感器)。因为使用了自动多通道转换,数据的取出工作最适合使用DMA方式取出,so,我们在内存里开辟了一个u16 AD_Value 数组,并设置了相应的DMA模块,使ADC在每个通道转换结束后启动DMA传输,其缓冲区数据量为2个HalfWord,使两路通道的转换结果自动的分别落到AD_Value 和AD_Value 中。   然后,在主函数里,就无需手动启动AD转换,等待转换结束,再取结果了。我们可以在主函数里随时取AD_Value中的数值,那里永远都是最新的AD转换结果。   如果我们定义一个更大的AD_
[单片机]
做单片机设计,STM32 GPIO外部中断你必须知道
一、STM32中断分组: STM32 的每一个GPIO都能配置成一个外部中断触发源,这点也是 STM32 的强大之处。STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0为第一组,那么依此类推,我们能得出一共有16 组,STM32 规定,每一组中同时只能有一个中断触发源工作,那么,最多工作的也就是16个外部中断。STM32F103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32F103 的19 个外部中断为: 线 0~15:对应外部 IO 口的输入中断。 线 16:连接到 PVD 输出。
[单片机]
做单片机设计,<font color='red'>STM32</font> GPIO外部中断你必须知道
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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