stm32学习笔记 | 您所在的位置:网站首页 › stm32输出PWM波给光耦 › stm32学习笔记 |
文章目录
一、神兵:PWM基本知识二、利用stm32定时器实现PWM具体原理stm32中PWM的相关配置PWM输出管脚
三、使用PWM实现呼吸灯。周期,占空比计算公式编程思路代码
一、神兵:PWM基本知识
抄自百度的定义: Pulse Width Modulation 就是通常所说的PWM,译为脉冲宽度调制,简称脉宽调制。也就占空比。 脉冲宽度调制(PWM)是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。 PWM的优点: 从处理器到被控系统信号都是数字形式的,无需进行数模转换。对噪声抵抗能力的增强.总之,PWM既经济、节约空间、抗噪性能强,是一种值得广大工程师在许多设计应用中使用的有效技术。 提问: 由于计算机不能输出模拟电压,只能输出0 或5V 的的数字电压值。需要输出模拟电压时,怎么办?如需要输出一个 ,3.3V的电压 或者 2.7V的电压,怎么办? 这时请出我们的神兵利器:PWM 电压换算原理: 输出电压值计算公式:(接通时间/脉冲时间)*最大电压值 基本方法:通过改变 (接通时间/脉冲时间) 从而改变输出的电压值。 由上图可以看出,PWM有三个基本参数: 脉冲宽度变化幅度脉冲周期电压高度(5v)![]() 由基础知识知道一个PWM的方波的产生,我们需要考虑脉冲的周期、脉冲宽度变化幅度,电压高度。 ![]() ![]() 相关寄存器: ![]() ![]()
pwm.h #ifndef PWM_H #define PWM_H #include "stm32f10x.h" void TIM3_PWM_Init(u16 arr,u16 psc);//注意arr的值要大于CCR的值 #endifpwm.c #include "pwm.h" void TIM3_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIOInitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; //使能时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //重映射 GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //配置GPIO为AFIO GPIOInitStructure.GPIO_Pin = GPIO_Pin_5; GPIOInitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIOInitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIOInitStructure); //初始化 TIM3 TIM_TimeBaseStructure.TIM_Period = arr; //设置在自动重装载周期值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //这个起到滤波的作用,默认0就行 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化 TIM3 Channel2 PWM 模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择 PWM 模式 2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高 TIM_OC2Init(TIM3, &TIM_OCInitStructure); //初始化外设 TIM3 OC2 //使能TIM,CCR预装载寄存器 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能预装载寄存器 TIM_Cmd(TIM3, ENABLE); //使能 TIM3 }main.c #include "stm32f10x.h" #include "bsp_systick.h" #include "led.h" #include "exti.h" #include "Tool.h" #include "usart.h" #include "pwm.h" u8 wifiConnected = 0; u8 cloudConnected = 0; int main(void) { u16 pwmValue=0; led_init(); usart1_init(9600); TIM3_PWM_Init(2999,23); //24分频,PWM 频率=72M/24/3000=1000hz,周期为1ms led1 = 1; led2 = 1; printf("system start!\n"); while(1) { SysTick_Delay_ms(1); TIM_SetCompare2(TIM3,pwmValue); pwmValue++; //大约3000ms完成一次渐亮 if(pwmValue>2999) pwmValue=0; } } |
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |