实验五 PWM应用

实验五 PWM应用

相关电路代码文件下载https://wwe.lanzouw.com/ioorOyxic0h

一.实验目的

(1)熟悉STM32CubeMX的安装与使用。
(2)熟悉MDK Keil软件的安装与使用。
(3)熟悉Proteus仿真软件的使用。
(4)掌握STM32定时器的应用方法。

二.实验内容

利用STM32F103芯片的PWM功能实现有节奏的呼吸灯,呼吸灯数量3 个,其他电子元器件根据需要自行添加。
实验扩展(任选其一)
呼吸灯数量在5个以上。(已选)。
按键控制。

三.电路设计说明

准备12个黄色LED灯(LED-YELLOW)并将每个LED灯设置为Digital模式,一个STM32F103R6芯片,外加10Ω电阻和+5V电源若干,LED灯需要接电阻以及电源。准备三个示波器,可以可视化波形。
将LED灯D1-D4连接到定时器3上并将对应的引脚接到示波器上:
将LED灯D1的一端引脚标记为T3C1,将STM32F103R6芯片的PA6引脚标记为T3C1,表示连线。
将LED灯D2的一端引脚标记为T3C2,将STM32F103R6芯片的PA7引脚标记为T3C2,表示连线。
将LED灯D3的一端引脚标记为T3C3,将STM32F103R6芯片的PB0引脚标记为T3C3,表示连线。
将LED灯D4的一端引脚标记为T3C4,将STM32F103R6芯片的PB1引脚标记为T3C4,表示连线。
将LED灯D1-D4连接上电源及电阻。
将LED灯D5-D7,D9连接到定时器2上并将对应的引脚接到示波器上:
将LED灯D5的一端引脚标记为T2C1,将STM32F103R6芯片的PA0引脚标记为T2C1,表示连线。
将LED灯D6的一端引脚标记为T2C2,将STM32F103R6芯片的PA1引脚标记为T2C2,表示连线。
将LED灯D7的一端引脚标记为T2C3,将STM32F103R6芯片的PA2引脚标记为T2C3,表示连线。
将LED灯D9的一端引脚标记为T2C4,将STM32F103R6芯片的PA3引脚标记为T2C4,表示连线。
将LED灯D5-D7,D9连接上电源及电阻。
将LED灯D11-D14连接到定时器1上:
将LED灯D11的一端引脚标记为T1C1,将STM32F103R6芯片的PA8引脚标记为T1C1,表示连线。
将LED灯D12的一端引脚标记为T1C2,将STM32F103R6芯片的PA9引脚标记为T1C2,表示连线。
将LED灯D13的一端引脚标记为T1C3,将STM32F103R6芯片的PA10引脚标记为T1C3,表示连线。
将LED灯D14的一端引脚标记为T1C4,将STM32F103R6芯片的PA11引脚标记为T1C4,表示连线。
将LED灯D11-D14连接上电源及电阻。
将STM32F103R6芯片的定时器进行如下配置:
将定时器TIM1,TIM2和TIM3及每个定时器的Channel1-Channel4打开,时钟源选择内部时钟,设置定时器的分频系数为72-1,计数周期设为1000-1,并将每个Channel的PWM 极性设置为low。如图 1 STM32F103R6芯片定时器配置1和图 2 STM32F103R6芯片定时器配置2中所示:
图 1 STM32F103R6芯片定时器配置1
图 1 STM32F103R6芯片定时器配置1

图 2 STM32F103R6芯片定时器配置2
图 2 STM32F103R6芯片定时器配置2

四.电路图

图 3 实验设计电路图
图 3 实验设计电路图

五.程序设计说明

在主函数中,首先定义占空比并初始化为0:uint16_t pwmval = 0;,然后将GPIO和TIM1-TIM3初始化:MX_GPIO_Init(); MX_TIM3_Init(); MX_TIM2_Init(); MX_TIM1_Init();。然后利用HAL_TIM_PWM_Start()函数将TIM1-TIM3的Channel1- Channel4全部打开。然后在while(1)循环中首先通过一个while()将占空比pwmval逐次循环递增,然后通过__HAL_TIM_SET_COMPARE()函数更改每个定时器的每个通道的占空比。给每个通道的占空比设定一个系数,系数逐级递增,从而控制定时器频率的不同。然后再通过一个while()将占空比pwmval逐次循环递减。也要通过__HAL_TIM_SET_COMPARE()函数更改每个定时器的每个通道的占空比。给每个通道的占空比设定一个系数,系数逐级递增,从而控制定时器频率的不同。

六.主要的程序源码

int main(void)
{
    uint16_t pwmval = 0;
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_TIM3_Init();
    MX_TIM2_Init();
    MX_TIM1_Init();

    //HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
    HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
    HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);
    HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);

    //HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
    HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
    HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);
    HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4);

    HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
    HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
    HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);
    HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4);
    while (1)
    {
        while (pwmval < 100)
        {
            pwmval ++;
            __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pwmval*1);
            __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, pwmval*2);
            __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, pwmval*3);
            __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, pwmval*4);

            __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pwmval*5);
            __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, pwmval*6);
            __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, pwmval*7);
            __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, pwmval*8);

            __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pwmval*9);
            __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, pwmval*10);
            __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, pwmval*11);
            __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, pwmval*12);
            HAL_Delay(1);
        }
        while (pwmval)
        {
            pwmval --;
            __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pwmval*1);
            __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, pwmval*2);
            __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, pwmval*3);
            __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, pwmval*4);

            __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pwmval*5);
            __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, pwmval*6);
            __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, pwmval*7);
            __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, pwmval*8);

            __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pwmval*9);
            __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, pwmval*10);
            __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, pwmval*11);
            __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, pwmval*12);
            HAL_Delay(1);
        }
        HAL_Delay(1);
    }
}

七.实验结果

启动仿真后,12个LED灯的灯光亮暗开始有规律的变化。如图 4 开始仿真后的显示效果1和图 5 开始仿真后的显示效果2中所示。
图 6 开始仿真后的显示效果1
图 6 开始仿真后的显示效果1

图 7 开始仿真后的显示效果2
图 7 开始仿真后的显示效果2

八.总结

通过这次实验使我了解了STM32F103R6的PWM应用,掌握了STM32F103R6定时器的应用方法。可以通过STM32CubeMX、MDK Keil和Proteus软件完成了利用STM32F103芯片的PWM功能实现有节奏的呼吸灯的小程序。这次实验比较简单,主要难点在于定时器的配置,不过我们可以利用STM32CubeMX轻松实现有关定时器的代码配置。另外一个需要注意的地方是如何控制呼吸灯的频率。我通过设定不同定时器不同通道的占空比,每个占空比都设定一个不同的系数,来控制不同呼吸灯的频率。这次实验让我加深了对STM32PWM应用的理解,提高了自己的嵌入式实验动手能力。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 这个问题可能是由于Keil编译器无法找到所需的led.h文件导致的。解决方法是确保该文件已经正确地添加到项目中,并且路径设置正确。您可以检查项目设置和文件路径,确保它们正确无误。如果问题仍然存在,您可以尝试重新安装Keil编译器或者更新它的版本。 ### 回答2: Keil IDE 是嵌入式开发中常用的一款集成开发环境。当使用 Keil IDE 进行开发的时候,经常会发生一些错误提示。其中一种常见的错误提示就是 "led.h file not found",表示无法找到 led.h 文件。那么,这个问题是怎么导致的呢? 首先,让我们来了解一下 led.h 文件。该文件是一个包含了 LED 控制函数的头文件,通常用于驱动 LED 灯。当我们在 Keil 中编译源代码时,Keil IDE 会查找并包含所有需要的头文件,以确保程序编译能够成功。因此,如果出现 "led.h file not found" 的错误提示,说明 Keil IDE 没有找到 led.h 文件。 那么,我们需要如何解决这个问题呢?首先,可以检查是否在 Keil 项目中导入了 led.h 文件。应该将头文件添加到 "Include Paths" 中。其次,确保 led.h 文件的路径是正确的。最后,可以尝试手动将 led.h 文件复制到 Keil 项目的根目录下,并重启 Keil IDE。这样,Keil IDE 就能够找到该文件了。 需要注意的是,如果还是无法解决问题,可以检查一下代码中是否有拼写错误或者语法错误,这也会导致编译失败。同时,还可以尝试更新 Keil IDE 的版本,以保证其兼容性和稳定性。 综上所述,"led.h file not found" 错误提示的问题是由于 Keil IDE 找不到 led.h 文件所导致的。通过检查文件路径、导入文件、重启 IDE 等方法,可以解决这个问题。要注意代码的正确性,避免出现语法错误等问题。最终,我们可以成功编译开发板的程序,实现对 LED 灯的控制。 ### 回答3: keil 显示 "led.h file not found" 错误,可能有以下几种原因: 1. 头文件路径错误:可能是头文件的路径不正确,或者头文件没有添加到 keil 的工程里面。解决方法是查看头文件所在的目录,是否正确添加到 keil 的 Include 路径中,或者手动添加头文件。 2. 头文件名称错误:可能是头文件名称没有写对,或者大小写不一致。解决方法是查看头文件的名称和大小写是否正确。 3. 头文件丢失:可能是头文件不在 keil 的工程目录中或者删除了头文件。解决方法是找回头文件,或者重新下载并添加到 keil 的工程中。 4. 安装问题:可能是 keil 安装过程中出现错误,导致某些文件缺失或者无法正常加载。解决方法是重新安装 keil,或者通过 keil 支持团队寻求帮助。 综上所述,keil 显示 "led.h file not found" 错误,可能是因为头文件路径、头文件名称、头文件丢失或者安装问题等多种原因导致,并可以通过查找头文件、修正头文件路径或重新安装 keil 等方法解决此问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值