STM32之TIM3_PWM程序

发布者:skyshoucang最新更新时间:2021-05-17 来源: eefocus关键字:STM32  占空比 手机看文章 扫描二维码
随时随地手机看文章

简介:STM32之TIM3_PWM程序详解:调整CCR2_Val的值来改变占空比,逐步的控制LED1的亮度, 占空比大过一定值时,亮度的变化就不明显了,所以CCR2_VAL最大设定到17000。


原理图:


程序分析:


int main(void)


{


unsigned char a=0;


TIM_OCInitTypeDef TIM3_OCInitStructure;


RCC_Configuration();


time_ini();


SysTick_Config(72000); //配置SYSTICK时钟节拍为1ms一次


while(1){


Delay(1);//延时1ms


TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2


TIM3_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出禁止


TIM3_OCInitStructure.TIM_Pulse = CCR2_Val; //确定占空比


TIM3_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;


TIM_OC2Init(TIM3, &TIM3_OCInitStructure);




/*调整CCR2_Val的值来改变占空比,逐步的控制LED1的亮度, 占空比大过一定值时,


亮度的变化就不明显了,所以CCR2_VAL最大设定到17000*/


if(a==0) CCR2_Val=CCR2_Val+10;


else CCR2_Val=CCR2_Val-10;


if(CCR2_Val>17000){ CCR2_Val=17000; a=1;}


else if(CCR2_Val<200){ CCR2_Val=200; a=0;}


}


}


时钟初始化打开RCC_APB2Periph_AFIO ,RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOCD| RCC_APB2Periph_GPIOD| RCC_APB2Periph_GPIOE


void RCC_Configuration(void){




SystemInit();


RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC


| RCC_APB2Periph_GPIOD| RCC_APB2Periph_GPIOE , ENABLE);


}


配置初始化,初始化PB5为复用输出,TIM3部分映射到PB5,设置PWM的时钟为72M/(3*2400)=10K,初始化TIM3时钟,

占空比为CCR2_Val /(TIM_Period +1)



void time_ini(void){


GPIO_InitTypeDef GPIO_InitStructure;


RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);




GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PB5复用为TIM3的通道2


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


GPIO_Init(GPIOB, &GPIO_InitStructure);


/*TIM3局部复用功能开启在TIM3的局部复用开启时,PB5会被复用为TIM3_CH2*/


GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3 , ENABLE); //TIM3部分映射到PB5




/*-------------------------------------------------------------------


TIM3CLK=72MHz 预分频系数Prescaler=2 经过分频 定时器时钟为24MHz


根据公式 通道输出占空比=TIM3_CCR2/(TIM_Period+1),可以得到TIM_Pulse的计数值


捕获/比较寄存器2 TIM3_CCR2= CCR2_Val


-------------------------------------------------------------------*/


TIM3_TimeBaseStructure.TIM_Prescaler = 2; //预分频器TIM3_PSC=324M


TIM3_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数器向上计数模式 TIM3_CR1[4]=0


TIM3_TimeBaseStructure.TIM_Period =2399; //自动重装载寄存器TIM3_APR 确定频率为10KHz


TIM3_TimeBaseStructure.TIM_ClockDivision = 0x0;//时钟分频因子 TIM3_CR1[9:8]=00


TIM3_TimeBaseStructure.TIM_RepetitionCounter = 0x0;


TIM_TimeBaseInit(TIM3,&TIM3_TimeBaseStructure);//写TIM3各寄存器参数




TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2 TIM3_CCMR1[14:12]=111 在向上计数时,


//一旦TIMx_CNT电平,否则为有效电平


TIM3_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输入/捕获2输出允许 OC2信号输出到对应的输出引脚PB5


TIM3_OCInitStructure.TIM_Pulse = CCR2_Val; //确定占空比,这个值决定了有效电平的时间。


TIM3_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性 低电平有效 TIM3_CCER[5]=1;




TIM_OC2Init(TIM3, &TIM3_OCInitStructure);


TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);


TIM_Cmd(TIM3,ENABLE);//启动定时器3 TIM3_CR1[0]=1;


}




SysTick_Config(72000); //配置SYSTICK时钟节拍为1ms一次






while(1){


Delay(1);//延时1ms


TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2


TIM3_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出禁止


TIM3_OCInitStructure.TIM_Pulse = CCR2_Val; //确定占空比


TIM3_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;


TIM_OC2Init(TIM3, &TIM3_OCInitStructure);




/*调整CCR2_Val的值来改变占空比,逐步的控制LED1的亮度, 占空比大过一定值时,亮度的变化就不明显了,所以CCR2_VAL最大设定到17000*/


if(a==0) CCR2_Val=CCR2_Val+10;


else CCR2_Val=CCR2_Val-10;


if(CCR2_Val>17000){ CCR2_Val=17000; a=1;}


else if(CCR2_Val<200){ CCR2_Val=200; a=0;}


}


关键字:STM32  占空比 引用地址:STM32之TIM3_PWM程序

上一篇:STM32输入捕获简介
下一篇:使用变参函数实现STM32串口的简易printf功能

推荐阅读最新更新时间:2024-11-11 13:47

STM32的优先级NVIC_PriorityGroupConfig的理解及其使用
写作原由:因为之前有对stm32 优先级做过研究,但是没时间把整理的东西发表,最近项目需要2个串口,但是不是两个串口同时使用,只是随机使用其中一个,程序对2个串口的优先级需要配置; 此文思路:“中断优先级”思维导图-- 关键要点--- 结合图和要点相关程序应用例程讲解; 我们先来看ST公司的一张图: 我自己依据此图理解,应用思维导图画了一张方便理解:(如果看不清可通过ctrl+鼠标滑轮 放大看;) 前提条件1:组别优先顺序(第0组优先级最强,第4组优先级最弱):NVIC_PriorityGroup_0 NVIC_PriorityGroup_1 NVIC_PriorityGroup_2 NVIC_PriorityGroup
[单片机]
<font color='red'>STM32</font>的优先级NVIC_PriorityGroupConfig的理解及其使用
STM32标准库SPI的初始化
SPI的初始化比较简单,但是能明白原理是最好的,毕竟出了问题以后好排除。 SPI的初始化过程: 1、初始化GPIO 2、初始化SPI_InitStructure结构体 3、使能SPI外设 SPI的初始化结构体如下图所示: typedef struct { uint16_t SPI_Direction; uint16_t SPI_Mode; uint16_t SPI_Daize; uint16_t SPI_CPOL; uint16_t SPI_A; uint16_t SPI_NSS; uint16_t SPI_BaudRatePr
[单片机]
STM32初学笔记5之ADC(上)
自己单独编写了一个ADC的单独API接口文件,如下所示: =============================================================== ADC_Config.C =============================================================== /** ** 文件名称:ADC_Config.C ** 功能描述:ADC转换模块的配置 ** 硬件平台:ALIENTEK(STM32F103RBT6) ** 编译环境:Keil uversion4 IDE ** 库版本 :v3.5.0
[单片机]
<font color='red'>STM32</font>初学笔记5之ADC(上)
STM32 SHT10温湿度传感器的信号采集
首先讲讲SHT10这款温室度传感器。SHT1x(包括SHT10,SHT11和SHT15)属于Sersirion温湿度传感器家族中的贴片封装系列。更之前我讲过的DHT11这款温湿度传感器相比,体积小了许多,特别适合用于产品中。SHT10温湿度传感器包括一个电容性聚合体测湿敏感元件、一个用能隙材料制成的测温元件(文绉绉的),传感器内部有一个精度高达14为位的A/D转换器,适应串行接口电路实现无缝连接。该产品具有品质卓越、响应速度速度快,抗干扰能力强、性价比高等优点。 1、接口定义: SHT10的接口定义如下图所示: 如上图所示,1脚为GND,4脚为VDD。它的供电电压范围为2.4~5.5V,建议的电压为3.3V,在电源引脚(VD
[单片机]
<font color='red'>STM32</font> SHT10温湿度传感器的信号采集
使用Keil MDK以及标准外设库创建STM32工程
1.1 使用Keil MDK以及标准外设库创建STM32工程 通过上一节对标准外设库的介绍,想必各位读者对标准外设库已经有了基本的认识,然而由于标准外设库中文件众多,很多初学者在开始很长一段时间内甚至都无法完全自己建立一个工程,很多人只是依赖标准外设库或给定的工程模板。本节就介绍怎样利用Keil MDK开发环境和标准外设库来搭建自己的工程。 建立一个基于标准外设库其实并不复杂,网络上也有很多关于怎样在Keil MDK下建立工程的教程,方法也各异,本节所介绍的方法本着少改动、便于使用、方便更换器件等原则,给大家介绍怎样在Keil中创建一个工程,并以一个最简单的例子来说明怎样下载和调试程序。 1.1.1 开发工具与开发环境 1
[单片机]
使用Keil MDK以及标准外设库创建<font color='red'>STM32</font>工程
分析初始化STM32串口后进入发送完成中断的现象
最近在调试STM32串口过程中发现一个奇怪的问题,初始化串口1口,使能串口发送完成中断后,立刻就进入了发送完成中断,21ic论坛上也有同样的问题讨论,而香水版主并没有解释原因。为了彻底的搞明白产生这一现象的原因:我仔细的看了STM32手册中的串口部分的介绍: 以下是字符发送的配置过程,注意第6点,在设置USART_CR1中的TE位时,会发送一个空闲帧作为第一次数据发送,所以即便你执行了USART_ClearFlag(USART1, USART_FLAG_TC); (这个函数肯定在空闲帧数据发送完成前执行),所以当空闲帧发送完后,就进入发送完成中断。 配置步骤: 1. 通过在USART_CR1寄存器上置位UE位来激活USART 2
[单片机]
stm32系统时钟配置问题
系统从上电复位到72mz配置好之前,提供时钟的是内如高速rc振荡器提供8MZ的频率,这个由下面void SystemInit (void)函数的前面的一部分代码来完成的和保证的: RCC- CR |= (uint32_t)0x00000001; #ifndef STM32F10X_CL RCC- CFGR &= (uint32_t)0xF8FF0000; #else RCC- CFGR &= (uint32_t)0xF0FF0000; #endif RCC- CR &= (uint32_t)0xFEF6FFFF; RCC- CR &= (uint32_t)0xFFFBFFFF;
[单片机]
GD32代码移植STM32(一)
GAIWEI例子:GD32F103移植STM32F103 使用相同FLASH和管脚数量相同的芯片,例如GDF103C8T6移植STM32F103C8T6程序。虽然两个款芯片的寄存器地址以及架构基本相同。但是需要注意的是GD32F10x主频是108兆,但是STM32F10x主频是72兆。所以需要针对以RCC时钟进行修改。 1.先将芯片的选项进行修改:查找对应芯片。 2.将STM32的启动文件替换成GD的启动文件。 3.修改时钟相关配置。 打开stm32f10x.h文件,#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*! Time out for HSE start up
[单片机]
GD32代码移植<font color='red'>STM32</font>(一)
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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