关于STM32的 一个TIM1 的PWM程序和PWM简单使用

发布者:电子设计探索者最新更新时间:2020-02-17 来源: elecfans关键字:STM32  TIM1  PWM 手机看文章 扫描二维码
随时随地手机看文章

高级定时器与通用定时器比较类似,下面是一个TIM1 的PWM 程序,TIM1是STM32唯一的高级定时器。共有4个通道有 死区有互补。


先是配置IO脚:

GPIO_InitTypeDef GPIO_InitStructure;

/* PA8设置为功能脚(PWM) */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/*PB13 设置为PWM的反极性输出*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);

/*开时钟PWM的 与GPIO的*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

/*配置TIM1*/

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_OCInitTypeDef TIM_OCInitStructure;

voidTim1_Configuration(void)

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_DeInit(TIM1);//重设为缺省值

/*TIM1时钟配置*/

TIM_TimeBaseStructure.TIM_Prescaler = 4000;//预分频(时钟分频)72M/4000=18K

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数

TIM_TimeBaseStructure.TIM_Period = 144;//装载值 18k/144=125hz 就是说向上加的144便满了

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//设置了时钟分割不懂得不管

TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;//周期计数器值 不懂得不管

TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);//初始化TIMx的时间基数单位

/* Channel 1 Configuration in PWM mode 通道一的PWM*/

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

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//正向通道有效 PA8

TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//反向通道也有效PB13

TIM_OCInitStructure.TIM_Pulse = 40; //占空时间 144 中有40的时间为高,互补的输出正好相反

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性

TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; //互补端的极性

TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;//空闲状态下的非工作状态 不管

TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;//先不管

TIM_OC1Init(TIM1,&TIM_OCInitStructure); //数初始化外设TIMx通道1这里2.0库为TIM_OCInit

/* TIM1 counter enable开定时器 */

TIM_Cmd(TIM1,ENABLE);

/* TIM1 Main Output Enable 使能TIM1外设的主输出*/

TIM_CtrlPWMOutputs(TIM1,ENABLE);

}

//设置捕获寄存器1

voidSetT1Pwm1(u16 pulse)

{

TIM1-》CCR1=pulse;

}

/*操作寄存器改变占空时间*/

/*****************************************************************************************************************

TIM1的定时器通道时间 1到4 分别为 PB8 PA9 PA10 PA11 而互补输出分别为 PB13 PB14 PB15

中止 PB12 。

如果输出与互补输出极性相同的话 就刚好输出高 互补低 至于PWM模式1 与模式2的区别

在下图:

这个是模式1的 了绿为输出 黄为互补

*************************************************************************************************

上图是模式2的情况 正好和模式1的反过来了 144中有40 为高 互补的有40为低。

*************************************************************************************************/

//在MAIN 中加点键盘扫描啥的 用来改变占空比

/************************************************************

**实验名称:PWM

**功能:是PA8产生PWM输出,PA8为驱动LED1和马达的IO,

通过UP DOWN键,可以改变占空比,从而让ED1和小马达的产生变化

**注意事项:LED是低有效,马达则是高有效,所以LED全灭的时候马达转速达到最高。

**作者:电子白菜

*************************************************************/

#include“STM32Lib\stm32f10x.h”

#include“hal.h”

extern voidSetT1Pwm1(u16 pulse);

intmain(void)

{

u16 pulse=40;

ChipHalInit();//片内硬件初始化

ChipOutHalInit();//片外硬件初始化

for(;;)

{

if(GET_UP())

{

while(GET_UP());

if(pulse《=144)

{

pulse+=5;

SetT1Pwm1(pulse);

}

}

if(GET_DOWN())

{

while(GET_DOWN());

if(pulse》30)

{

pulse-=5;

SetT1Pwm1(pulse);

}

}

}

}

/***************************************************************************************/

再来两张 最小系统板子

/***************************************************************************************/

你也只需一块这样板子再来一点时间与干劲这个历程一样跑的起来。

关键字:STM32  TIM1  PWM 引用地址:关于STM32的 一个TIM1 的PWM程序和PWM简单使用

上一篇:一文了解stm32使用DMA模块的相关操作
下一篇:STM32定时器产生PWM彻底应用

推荐阅读最新更新时间:2024-11-10 16:10

stm32TIM输出通道配置详解
1、使能TIM时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM*,ENABLE); 2、基础设置 TIM_TimeBaseStructure.TIM_Period 计数值 TIM_TimeBaseStructure.TIM_Prescaler 预分频,此值+1为分频的除数 TIM_TimeBaseStructure.TIM_ClockDivision = 0 时钟因子 待做进一步说明 TIM_TimeBaseStructure.TIM_Repetitio
[单片机]
使用AVR定时/计数器的PWM功能设计要点
一、定时/计数器PWM设计要点 根据PWM的特点,在使用ATmega128的定时/计数器设计输出PWM时应注意以下几点: 1.首先应根据实际的情况,确定需要输出的PWM频率范围,这个频率与控制的对象有关。如输出PWM波用于控制灯的亮度,由于人眼不能分辨42Hz以上的频率,所以PWM的频率应高于42Hz,否则人眼会察觉到灯的闪烁。 2.然后根据需要PWM的频率范围确定ATmega128定时/计数器的PWM工作方式。AVR定时/计数器的PWM模式可以分成快速PWM和频率(相位)调整PWM两大类。  3.快速PWM可以的到比较高频率的PWM输出,但占空比的调节精度稍微差一些。此时计数器仅工作在单程正向计数方式,计数器的上限值决定PW
[嵌入式]
STM32 PB4不能做普通IO解决方法
PB4默认是JTAG引脚,并置于上拉模式,所以没法直接当做普通的IO口拉低。可以复用为SWD下载方式,那么PB4就可以“省出来了 1 (RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);打开时钟 复用时钟 .执行端口重映射时,复用功能时钟得使能:RCC_APB2Periph_AFIO 2. GPIO_Remap_SWJ_Disable Full SWJ Disabled (JTAG-DP + SW-DP)此时PA13|PA14|PA15|PB3|PB4都可作为普通IO用了 为了保存某些调试端口,GPIO_R
[单片机]
stm32专题十九:FatFs文件系统整体架构
在标准C语言中,有专门对文件进行操作的函数,如下所示。这些函数在windows或者linux系统中,都可以直接方便地使用。但是,在stm32中,这些函数不能直接使用。因为,windows和linux系统,都已经在平台上支持了这些c语言函数,类似于之前重定向printf到串口操作。 FatFs是面向小型嵌入式系统的一种通用的 FAT 文件系统。它完全是由ANSI C语言编写并且完全独立于底层的 I/O 介质。因此它可以很容易地不加修改地移植到其他的处理器当中,如8051、PIC、AVR、SH、Z80、H8、ARM 等。FatFs 支持 FAT12、FAT16、FAT32 等格式,所以我们利用前面写好的SPI Flash芯片驱动,
[单片机]
<font color='red'>stm32</font>专题十九:FatFs文件系统整体架构
STM32之多通道AD使用DMA采集数据
1、配置 ADC配置成SCAN 连续模式。 需要设置rank,每一个通道有不同的rank,也就是存放的ram。 使用3个字节的buf,第一个通道放在第一个buf里。依次存放,可以循环往复。覆盖操作。 buf最好设置为volatile,直接从ram里面获取值,不让编译器进行优化。 1)绑定通道和ram的联系,设置采样频率。 2)开始DMA采集,绑定buf。 DMA配置: hdma_adc1.Instance = DMA2_Stream0; hdma_adc1.Instance.Channel = DMA_CHANNEL_0; hdma_adc1.Instance.Direction
[单片机]
STM32串口+DMA的使用2
uint8_t UART4_Rx_buffer ,UART4_Rx_num; void UART4_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; DMA_InitTypeDef DMA_InitStructure; // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //选择NVIC优先级分组0 R
[单片机]
PWM控制LED的亮度的程序
for(a=v;a 15;a++) { m=1; n=240; for(j=1;j 239;j++) { n--; for(h=0;h sudu1;h++) { if(a==0) { P2=0xff; P3=0xff; P1=0xff; } else { P2=bian ; P3=shu ; P1=bian ; P1=shu ; P0=bian ; P0=shu ; } for(l=n;l 0;l--) {} P2=bian ; P3=shu ; P1=bian ; P1=shu ; P0=bian ; P0=shu ; for(k=m;k 0;k--) {} } m++; } delay_long(20000); delay_lo
[单片机]
STM32管脚重定义
最近在学习STM32,在BZ上一篇关于的串口通信文章里有这么一段代码:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO,ENABLE); 当初是参考开发的里子写的一直对GPIOD或上“RCC_APB2Periph_AFIO”这句话的意思没搞懂,通过这几天在网上查找资料和看手册,终于高清楚了,不敢独享,希望能对跟我一样的新手有所帮助吧o(∩_∩)o... STM32上有很多I/O口,也有很多的内置外设想I2C,ADC,ISP,USART等 ,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的,也就是I/O管脚的复用功能。但是STM32还有一特别
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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