STM32 PWM波

                      利用STM32产生占空比可以调节的PWM波

科普:pwm(Pulse Width Modulation)脉宽调制

关于pwm波的产生:
1.首先来看一下代码:

pwm波模式的相关配置(利用的是定时器TIM3)

static void TIM3_Mode_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

//最初状态,设定的高低电平的跳变值
u16 CCR1_Val = 500;

//关于定时器的基本设置
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 999; //定时周期:999+1
TIM_TimeBaseStructure.TIM_Prescaler = 71; //设置预分频,分频系数为71+1,即当前频率为1MHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //设置时钟分频系数
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置计数模式为:向上计数
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //由TIM_TimeBaseStructure中的指定参数对TIM3进行初始化

/* PWM1 Mode configuration: Channel1 */

PWM模式的配置

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //定时器模式为pwm1模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能输出状态
TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //设置初始高低电平跳变值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //设置输出极性为高
TIM_OC1Init(TIM3, &TIM_OCInitStructure); //根据TIM_OCInitStructure的指定参数对TIM3通道1进行初始化
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR1上的预装载寄存器
TIM_ARRPreloadConfig(TIM3, ENABLE); // 使能TIM3在ARR上的预装载寄存器
TIM_ClearFlag(TIM3,TIM_FLAG_Update);//清楚TIM3定时器的更新标志
TIM_ITConfig(TIM3,TIM_FLAG_Update,ENABLE);//使能Tim3的更新动作
/* TIM3 enable counter */
TIM_Cmd(TIM3, ENABLE); // 使能TIM3
}

/********************************以上内容为产生pwm波在定时器的模式上的相关配置*************************************/

//输出端口的配置

static void TIM3_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

/* GPIOA and GPIOB clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);

/*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 采用复用方式,故将模式设置为复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}

/*********************************设置定时器的优先级**************************************/

void TIM3_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_Instructure;
//设置优先级分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

//使能指定的IRQ通道
NVIC_Instructure.NVIC_IRQChannel=TIM3_IRQn;

NVIC_Instructure.NVIC_IRQChannelCmd=ENABLE;

//设置占先优先级
NVIC_Instructure.NVIC_IRQChannelPreemptionPriority=0;

//设置从优先级
NVIC_Instructure.NVIC_IRQChannelSubPriority=0;

//初始化NVIC寄存器
NVIC_Init(&NVIC_Instructure);
}

/**********************中断函数******************************/

u16 PWM_val[4]={500,375,250,125};
u16 counter=0;
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
{
TIM_SetCompare1(TIM3,PWM_val[counter]);//设置高低电平跳变的绝对时间,改变占空比
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
counter=(counter+1)%4;
}

}

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

由PA6k口在示波器上进行观察,得到占空比为500/1000,375/1000,250/1000,125、1000的pwm波,和设计思路完全吻合

/**********************************野心+天赋+勇气+勤奋程度*************************************************/

时间: 2024-10-06 18:15:29

STM32 PWM波的相关文章

CC1310生成PWM波

工作中因为时间紧迫,我不得不抛开TI提供的TI-RTOS.sdk和xdctools等工具,采用ucos + 库函数的方式去开发.最开始一头扎进去,碰见的就PWM的生成. PWM方面,TI自带封装好了PWM函数进行pwm的生成. 假如:我的需求是PWM的周期是2s,占空比50%,MCU主频是48MHz.于是我直接设置 params.periodUnits = PWM_PERIOD_US; params.periodValue = pwmPeriod; params.dutyUnits = PWM_

使用引脚模拟PWM波控制引脚

1 /********************************* 2 代码功能:输出PWM波控制引脚 3 使用函数: 4 5 创作时间:2016*10*07 6 作者邮箱:[email protected] 7 ********************************/ 8 int ledPin = 13; 9 void setup() 10 { 11 pinMode(ledPin,OUTPUT); 12 } 13 int t_PWMMax = 500; 14 void loop

STM32——PWM基本知识及配置过程

将通用定时器分为四个部分: 1,选择时钟 2,时基电路 3,输入捕获 4,输出比较 本节定时器PWM输出主要涉及到定时器框图右下方部分,即输出比较部分 和上一讲相同,时基时钟来源于内部默认时钟 对此有疑问请参考 : 定时器中断实验 中 定时器时钟选择部分 和 定时器时钟来源部分 什么是PWM 脉冲宽度调制(PWM),是英文"Pulse Width Modulation"的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量.通信到功率控

STM32 PWM配置

一:配置TIM3的ARR寄存器和PSC寄存器,确定PWM频率. 这里配置的这两个定时器确定了PWM的频率,我的理解是:PWM的周期(频率)就是ARR寄存器值与PSC寄存器值相乘得来,但不是简单意义上的相乘,例如要设置PWM的频率参考上次通用定时器中设置溢出时间的算法,例如输出100HZ频率的PWM,首先,确定TIMx的时钟,除非APB1的时钟分频数设置为1,否则通用定时器TIMx的时钟是APB1时钟的2倍,这时的TIMx时钟为72MHz,用这个TIMx时钟72MHz除以(PSC+1),得到定时器

进阶之路(基础篇) - 005 模拟PWM波控制引脚

1 /********************************* 2 代码功能:输出PWM波控制引脚 3 使用函数: 4 5 创作时间:2016*10*07 6 作者邮箱:[email protected] 7 ********************************/ 8 int ledPin = 13; 9 void setup() 10 { 11 pinMode(ledPin,OUTPUT); 12 } 13 int t_PWMMax = 500; 14 void loop

nRF51822使用Timer制作4路PWM波详解

Date:2015.5.8 Author:杨正  QQ:1209758756 <[email protected]> 一.            pwm简介 PWM英文名叫Pulse Width Modulation,中文名叫脉宽调制.那它到底是什么呢?其实它是由定时器产生的,比普通的定时器多了一个比较寄存器.PWM里面有一个词叫占空比,即一个周期内,高电平持续时间与周期的比值.如下图: 占空比(dutycycle) = t/T. PWM用途:控制电机调速,控制蜂鸣器播放音乐,控制led灯亮度

stm32cube--通用定时器--产生pwm波

看了通用定时器的资料,发现内容挺多,挺难看懂,现在还是先掌握使用方法,以后再多看几遍吧. ① ② ③生成mdk工程后,在main.c的while(1)前面加上HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);就可以产生pwm波了. 通过一些实验可知,32cube配置好中断生成工程以后,程序中已经将中断相关的参数和准备工作都做好了,但我们要进入中断还必须手动添加中断的启动函数.

利用MDK4中的逻辑分析仪分析IO口的PWM波

1.先设置软件仿真 ,可参看STM32不完全手册的2.4的软件仿真这一章 (原文件名:1.jpg) Example functionality:                                                   - Clock Settings:   - XTAL    =            8.00 MHz   - SYSCLK  =           72.00 MHz   - HCLK    = SYSCLK  = 72.00 MHz   - PCL

stm32 PWM &amp; 定时器总结

学习后发现stm32的定时器功能确实很强大,小总结一下方便以后使用的时候做参考.Stm32定时器一共分为三种:tim1和tim8是高级定时器,6和7是基本定时器,2-5是通用定时器.从名字就可以看得出来主要功能上的差异.今天我主要是用定时器做pwm输出,所以总结也主要是针对pwm方面的. 先大致说下通用和高级定时器的区别.通用的可以输出四路pwm信号互不影响.高级定时器可以输出三对互补pwm信号外加ch4通道,也就是一共七路. 所以这样算下来stm32一共可以生成4*5+7*2=30路pwm信号