STM32输出PWM

最近要用STM32来输出PWM,花了一个晚上写完了,记录一下

(我用的是STM32F303CCT6)

1.打开定时器时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

2.打开输出引脚的GPIO时钟

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

3.配置相应引脚为 AF模式(具体AFx要看手册)

GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_2);

4.初始化输出引脚为 AF模式, 推挽输出, 上拉, 速度为GPIO_Speed_Level_3

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; //PA6
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_Level_3;
GPIO_Init(GPIOA, &GPIO_InitStruct);

5.定时器设置( 频率 = 72000000÷(arr+1)÷(psc+1))

TIM_TimeBaseStruct.TIM_Period = 999; //arr
TIM_TimeBaseStruct.TIM_Prescaler = 1439;//psc
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStruct.TIM_RepetitionCounter = 0;//重复溢出多少次进中断
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStruct);

6.定时器通道设置 PWM模式1, 输出极性高, 允许输出

TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStruct);

7.打开定时器

TIM_Cmd(TIM3, ENABLE);

8.设置占空比 Duty  =  pwmval  ÷  arr

TIM_SetCompare1(TIM3, 99);// pwmval Duty = arr/pwmval

9.全部代码如下

GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_2);

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; 
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_Level_3;
GPIO_Init(GPIOA, &GPIO_InitStruct);

TIM_TimeBaseStruct.TIM_Period = 999; //arr
TIM_TimeBaseStruct.TIM_Prescaler = 1439;// psc 
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStruct.TIM_RepetitionCounter = 0;//重复溢出多少次进中断
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStruct);

TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStruct);
TIM_OC2Init(TIM3, &TIM_OCInitStruct);

TIM_Cmd(TIM3, ENABLE);

TIM_SetCompare1(TIM3, 99);//pwmval

在STM32中,PWM输出的 频率,占空比,模式 有好几个不同的参数设置

原文地址:https://www.cnblogs.com/sypspace/p/9552699.html

时间: 2024-09-30 22:17:58

STM32输出PWM的相关文章

在Keil中做stm32的软件仿真,查看输出PWM波形时,在逻辑分析仪中规定IO口signal,出现"unknow signal"

文章源地址:http://blog.sina.com.cn/s/blog_dc9244010102vtn1.html 最近在学习STM32的PWM波输出,由于手中没有示波器,于是按照野火的教程使用软件仿真,使用MDK5自带的逻辑分析仪观察波形,前边一路顺利,在打开逻辑分析仪往里添加signal时,问题出现了——Unknown Signal!信号无法添加进去.在百度文库看到一篇关于MDK460相关问题的解决方案,于是我抱着试一试的态度,试了一试,结果挺好的,于是想到了和大家分享一下. 1.错误提示

详解STM32的PWM输出及频率和脉宽(占空比)的计算——寄存器配置六步曲!(转)

一.stm32的pwm输出引脚是使用的IO口的复用功能. 二.T2~T5这4个通用定时器均可输出4路PWM--CH1~CH4. 三.我们以tim3的CH1路pwm输出为例来进行图文讲解(其它类似),并在最后给出tim3的ch1和ch2两路pwm输出的c代码(已在STM32F103RBT6上测试成功,大家放心使用!). 四.给出了PWM频率和占空比的计算公式. 步骤如下: 1.使能TIM3时钟 RCC->APB1ENR |= 1 << 1; 2.配置对应引脚(PA6)的复用输出功能 GPI

STM32定时器输出PWM频率和步进电机控制速度计算

1.STM32F4系列定时器输出PWM频率计算 第一步,了解定时器的时钟多少: 我们知道AHP总线是168Mhz的频率,而APB1和APB2都是挂在AHP总线上的. (1)高级定时器timer1, timer8以及通用定时器timer9, timer10, timer11的时钟来源是APB2总线(2)通用定时器timer2~timer5,通用定时器timer12~timer14以及基本定时器timer6,timer7的时钟来源是APB1总线 从STM32F4的内部时钟树可知: 当APB1和APB

基于STM32F030F4P9和STM32 CUBEMX 输出PWM波形

STM32F030F4P9定时器功能比较丰富,在此记录项目中使用其自动输出PWM波形(频率:50HZ).CubeMX配置定时器如下图说明. 在此定时器基础时钟为48MHZ,配置中不做分频处理,预分频系数为48,定时器计数器寄存器为20000,可求得周期为: T = ( ( 1 / (48Mhz / 48) ) * 20000) = 20ms 在PWM输出配置选项中,改变Pulse可改变PWM的占空比.CH Polarity配置当计数器中的值小于Pulse时,输出高电平, CH Idle Stat

STM32F0xx_TIM输出PWM配置详细过程

前言 前面我说过STM32的定时器功能很强大,今天就来总结一下它的另外一个“强大”功能:TIM的比较输出功能,输出可调PWM波形.直接调用函数接口“TIM2_CH1_PWM(uint32_t Freq, uint16_t Dutycycle)”传入频率和占空比就能输出指定的波形. 我提供的软件工程直接调用是比较简单就能实现想要的PWM波形.但是,如果你是学习者,建议还是进去函数把每一个细节了解清楚,里面的东西可能对你掌握TIM很有帮助. 本着免费分享的原则,如果你觉得分享的内容对你有用,认可我分

STM32之PWM君

PWM..英语好的人估计又知道这三个大写字母代表哪三个英语单词了.小弟不才,就说中文意思好了:脉冲宽度调制,玩过飞思卡尔的人估计对PWM非常的不陌生吧.电机驱动需要PWM,控制舵机的转向需要PWM,总之.可以说,PWM,you are so good. 好了..言归正传,广大的互联网的网友们,咱们又见面了,大家早上晚上中午好好好.额..好像也没见过面,STM32的PWM,可谓是小强中的小强,STM32的PWM,就是由定时器产生的,但是奇怪的是除了定时器TIM6和TIM7不能产生PWM外,其他的定

STM32F4_TIM输出PWM波形(可调频率、占空比)

Ⅰ.概述 上一篇文章关于STM32基本的计数原理明白之后,该文章是在其基础上进行拓展,讲述关于STM32比较输出的功能,以输出PWM波形为实例来讲述. 提供实例工程中比较实用的函数:只需要调用该函数,参数为频率和占空比 void TIM2_CH2_PWM(uint32_t Freq, uint16_t Dutycycle); 先看一下实例中1KHz.20%占空比波形图 TIM2_CH2_PWM(1000, 20); 关于本文的更多详情请往下看. Ⅱ.实例工程下载 笔者针对于初学者提供的例程都是去

stm32之PWM

PWM是pulse width modulation的缩写,即脉冲宽度调制.其通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形: 1.PWM是一种对模拟信号电平进行数字编码的方法.通过高分辨率计数器的使用,方波的占空比被调制,用来对一个具体模拟信号的电平进行编码.等效的实现是基于采样定理中的一个重要结论:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同.冲量即指窄脉冲的面接.这里所说的效果基本相同,是指该环节的输出响应波形基本相同. 2.如把各输出波形用傅立叶分析,则它们的

关于STM32 定时器 PWM 实时调节占空比时,预装载特性

最近在调试项目的时候遇到一个奇怪的现象:在调试状态下,给定时器捕获比较寄存器赋不同值,能产生不同占空比的波形(图1).反映到器件上也有不同的电压显示,但是在设备运行的时候,就不行了(图2). 图1 图2 纠结了N天后,也没有办法解决,只好乖乖的看STM32 控制器手册找找看了,结果还真找到了. 从图中可以看到,如果使能预装载特性,则数据会立即写入寄存器中,如果没有使能,那就得等到有事件(?)发生了.这我就明白了,在调试状态下,给寄存器赋值,不会产生什么影响,因为人的反应速度很慢,但是在运行的时候