stm32f103c8t6呼吸灯pwm proteus仿真
时间: 2025-06-01 20:21:43 浏览: 22
### 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 中搭建仿真电路时,需要将 STM32F103C8T6 的 PWM 输出引脚连接到 LED,并通过电阻限流。以下是关键步骤:
1. 添加 STM32F103C8T6 模型到 Proteus 项目中。
2. 配置 PA0 或其他 GPIO 引脚作为 TIM2 的 CH1 输出通道。
3. 连接 LED 和限流电阻到 PA0 引脚。
4. 将生成的 HEX 文件加载到 Proteus 的 STM32 模块中。
---
#### 三、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]。
---
阅读全文
相关推荐


















