实验五 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应用的理解,提高了自己的嵌入式实验动手能力。

版权声明:本文为CSDN博主「千色千寻」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38162369/article/details/122561636

实验五 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应用的理解,提高了自己的嵌入式实验动手能力。

版权声明:本文为CSDN博主「千色千寻」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38162369/article/details/122561636

生成海报
点赞 0

千色千寻

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

实验五 PWM应用

实验五 PWM应用 相关电路代码文件下载:https://wwe.lanzouw.com/ioorOyxic0h 一.实验目的 (1)熟悉STM32CubeMX的安装与使用。 &#xf

STM32C8T6+LORA(SX1278)

LoRa通信系统 从毕设开始搭建了一个简单的LORA通信系统(两块STM32C8T6最小单片机系统,两块正点原子的loRa,一块温湿度传感器)构建了一个简单的loRa通信系统作为入门。之