2、基于STM32F103C8T6的PWM呼吸灯proteus8.15仿真设计

---------------------------------------------------------------------------------------------------------------------------------

致力于毕设、个护美容、医疗等方案设计。

---------------------------------------------------------------------------------------------------------------------------------

目录

一、PWM工作原理

二、PWM的proteus仿真设计图

三、keil5源码

四、项目获取方式

一、PWM工作原理

 1、PWM定义

        PWM是一种模拟控制方式,根据相应载荷的变化来调制晶体管栅极或基极的偏置,来实现开关稳压电源输出晶体管或晶体管导通时间的改变,这种方式能使电源的输出电压在工作条件变化时保持恒定。脉冲宽度调制(PWM )是一种对模拟信号电平进行数字编码的方法。
通过高分辨率计数器的使用,利用方波的占空比调制来对一个具体模拟信号的电平进行编码。pwm​​​​​​​信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。

2、工作原理

        PWM实现的原理是通过锯齿波/三角波(载波)所需要合成的波形(调制波)进行比较,然后确定PWM所需要输出的极性,通常是ON或者是OFF,作用于开关元器件。
 

二、PWM的proteus仿真设计图

 

三、keil5源码

四、项目获取方式

 读者朋友们,大家可以关注下我的公众号:嵌入式与酒,proteus仿真和代码都在链接里,后台回复获取:呼吸灯

 --------------------------------------------------------------------------------------------------------------------------------

 

### STM32F103C8T6 PWM 呼吸 Proteus 仿真 示例代码 教程 STM32F103C8T6 是一款基于 ARM Cortex-M3 内核的微控制器,广泛应用于嵌入式系统开发中。通过配置定时器(Timer)模块,可以生成 PWM 波形来控制 LED 的亮度变化,从而实现呼吸效果。以下是一个完整的教程和示例代码,帮助用户在 Proteus 中进行仿真。 --- #### 一、PWM 工作原理 PWM(Pulse Width Modulation,脉冲宽度调制)是一种通过调节脉冲信号的占空比来控制输出功率的技术。对于 LED 控制而言,通过改变 PWM 的占空比可以调节 LED 的亮度[^1]。具体公式为: \[ \text{Duty Cycle} = \frac{\text{CCR}}{\text{ARR} + 1} \] 其中,`CCR` 表示捕获/比较寄存器值,`ARR` 表示自动重载寄存器值[^3]。 --- #### 二、Proteus 仿真设计图 在 Proteus 中搭建仿真电路时,需要将 STM32F103C8T6PWM 输出引脚连接到 LED,并通过电阻限流。以下是关键步骤: 1. 添加 STM32F103C8T6 模型到 Proteus 项目中。 2. 配置 PA0 或其他 GPIO 引脚作为 TIM2 的 CH1 输出通道。 3. 连接 LED 和限流电阻到 PA0 引脚。 4. 将生成的 HEX 文件加载到 ProteusSTM32 模块中。 --- #### 三、Keil5 源码 以下是一个完整的示例代码,使用 TIM3 定时器生成 PWM 波形并控制 LED 的亮度变化。 ##### 1. `PWM.h` 头文件 ```c #ifndef __PWM_H #define __PWM_H #include "stm32f10x.h" void PWM_TIM3_Init(void); void PWM_TIM3_SetCompare1(uint16_t Compare); #endif ``` ##### 2. `PWM.c` 源文件 ```c #include "PWM.h" void PWM_TIM3_Init(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 使能 TIM3 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能 GPIOA 时钟 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6; // PA6 作为 TIM3_CH1 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct; TIM_TimeBaseStruct.TIM_Period = 999; // 自动重载值 (ARR) TIM_TimeBaseStruct.TIM_Prescaler = 7199; // 预分频值 TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStruct); TIM_OCInitTypeDef TIM_OCInitStruct; TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; // PWM 模式 1 TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStruct.TIM_Pulse = 0; // 初始占空比 TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStruct); TIM_Cmd(TIM3, ENABLE); // 启用 TIM3 } void PWM_TIM3_SetCompare1(uint16_t Compare) { TIM_SetCompare1(TIM3, Compare); // 设置 CCR 值 } ``` ##### 3. `main.c` 主程序 ```c #include "stm32f10x.h" #include "PWM.h" #include "delay.h" // 延时函数库 uint16_t brightness = 0; int main(void) { delay_init(); // 初始化延时函数 PWM_TIM3_Init(); // 初始化 TIM3 PWM while (1) { for (brightness = 0; brightness <= 100; brightness++) { // 亮度递增 PWM_TIM3_SetCompare1(brightness * 10); // 调整占空比 delay_ms(10); // 延时 } for (brightness = 100; brightness >= 0; brightness--) { // 亮度递减 PWM_TIM3_SetCompare1(brightness * 10); // 调整占空比 delay_ms(10); // 延时 } } } ``` --- #### 四、项目获取方式 上述代码可以直接用于 Keil5 编译环境,并生成 HEX 文件加载到 Proteus 中进行仿真。如果需要完整项目文件,可以通过以下链接下载: - 百度网盘链接:https://pan.baidu.com/s/1pcVtAcER2mAwnQnyRL3aXQ - 提取码:p8q4[^3] --- #### 五、效果展示 在 Proteus 中运行仿真后,可以看到 LED 的亮度随着时间逐渐变亮再变暗,形成呼吸效果。这种变化是通过调整 PWM 的占空比实现的[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值