本文目标:基于hal库的stm32呼吸灯实验
按照本文的描述,应该可以在你所处的硬件上调通代码。
先决条件:装有编译和集成的开发环境,比如:keil uvision5。
板子硬件要求:设计了led在定时器的接口上
呼吸灯是一种常见的电子制作实验项目,其通过控制 led 灯的亮度变化,实现了一种模拟人类呼吸的效果。 作为一种常见的数字调光技术,呼吸灯广泛应用于工业控制、智能家居等领域。 而在此过程中,使用微控制器如 stm32 ,则可以更加便捷、灵活地实现呼吸灯的控制。 因此,本文将介绍基于 stm32 的呼吸灯实验,通过代码编写、编译下载和调试运行,实现了一个简单的呼吸灯控制系统。
实验目的本实验旨在通过 stm32 的呼吸灯实验,掌握 stm32 的编程方法和调试技巧,并深入理解呼吸灯的原理、调光技术和周期控制等知识点。 在本实验过程中,我们将涉及 stm32 的 gpio 端口配置、定时器和 pwm 的使用、时钟配置和中断处理等技术
pwm介绍pwm(pulse width modulation)即脉冲宽度调制技术,是一种通过调节脉冲信号的占空比来实现模拟信号的调节的技术。 在pwm控制中,周期性的方波称为pwm波,其占空比是指高电平时间与周期的比值。 pwm波信号可以通过控制电路的输出电平来实现对外设的控制,如对led的亮度、电机的转速等。 通常使用定时器模块来生成pwm波,定时器在每个周期内发出固定的时间间隔中断,根据设定的占空比,每个周期内的高电平时间和低电平时间不同,从而实现对pwm波的控制。
基础工程使用stm32cubemx配置stm32的基本配置。 基本的配置如下:开启swd调试,开启外部时钟,配置相应的定时器。
呼吸灯连接的硬件定时器配置
时钟界面选项卡:
工程选项卡:
点击右上角的的生成代码:
使用keil打开工程,编译工程,一切都是ok
主要代码其中我定时器配置了200hz的频率,肉眼观察明显一些,主函数中改变占空比。
/* tim1 init function */void mx_tim1_init(void){ /* user code begin tim1_init 0 */ /* user code end tim1_init 0 */ tim_clockconfigtypedef sclocksourceconfig = {0}; tim_masterconfigtypedef smasterconfig = {0}; tim_oc_inittypedef sconfigoc = {0}; tim_breakdeadtimeconfigtypedef sbreakdeadtimeconfig = {0}; /* user code begin tim1_init 1 */ /* user code end tim1_init 1 */ htim1.instance = tim1; htim1.init.prescaler = 720-1; // 分频720 100khz 10us计一数 htim1.init.countermode = tim_countermode_up; htim1.init.period = 500-1; // 计数500次 500*10 = 5000us = 5ms = 200hz htim1.init.clockdivision = tim_clockdivision_div1; htim1.init.repetitioncounter = 0; htim1.init.autoreloadpreload = tim_autoreload_preload_disable; if (hal_tim_base_init(&htim1) != hal_ok) { error_handler(); } sclocksourceconfig.clocksource = tim_clocksource_internal; if (hal_tim_configclocksource(&htim1, &sclocksourceconfig) != hal_ok) { error_handler(); } if (hal_tim_pwm_init(&htim1) != hal_ok) { error_handler(); } smasterconfig.masteroutputtrigger = tim_trgo_reset; smasterconfig.masterslavemode = tim_masterslavemode_disable; if (hal_timex_masterconfigsynchronization(&htim1, &smasterconfig) != hal_ok) { error_handler(); } sconfigoc.ocmode = tim_ocmode_pwm1; sconfigoc.pulse = 0; sconfigoc.ocpolarity = tim_ocpolarity_high; sconfigoc.ocfastmode = tim_ocfast_disable; sconfigoc.ocidlestate = tim_ocidlestate_reset; sconfigoc.ocnidlestate = tim_ocnidlestate_reset; if (hal_tim_pwm_configchannel(&htim1, &sconfigoc, tim_channel_4) != hal_ok) { error_handler(); } sbreakdeadtimeconfig.offstaterunmode = tim_ossr_disable; sbreakdeadtimeconfig.offstateidlemode = tim_ossi_disable; sbreakdeadtimeconfig.locklevel = tim_locklevel_off; sbreakdeadtimeconfig.deadtime = 0; sbreakdeadtimeconfig.breakstate = tim_break_disable; sbreakdeadtimeconfig.breakpolarity = tim_breakpolarity_high; sbreakdeadtimeconfig.automaticoutput = tim_automaticoutput_disable; if (hal_timex_configbreakdeadtime(&htim1, &sbreakdeadtimeconfig) != hal_ok) { error_handler(); } /* user code begin tim1_init 2 */ /* user code end tim1_init 2 */ hal_tim_msppostinit(&htim1);}main函数
int main(void){ /* user code begin 1 */ //定义一个变量用来存储比较值 uint16_t pulse = 0; //定义一个变量用来存储方向,0表示递增,1表示递减 uint8_t dir = 0; /* user code end 1 */ /* mcu configuration--------------------------------------------------------*/ /* reset of all peripherals, initializes the flash interface and the systick. */ hal_init(); /* user code begin init */ /* user code end init */ /* configure the system clock */ systemclock_config(); /* user code begin sysinit */ /* user code end sysinit */ /* initialize all configured peripherals */ mx_gpio_init(); mx_usart1_uart_init(); mx_tim2_init(); mx_tim1_init(); /* user code begin 2 */ hal_tim_pwm_start(&htim1, tim_channel_4); /* user code end 2 */ /* infinite loop */ /* user code begin while */ while (1) { /* user code end while */ /* user code begin 3 */ //根据方向判断是递增还是递减 if (dir == 0) { //延时10毫秒 hal_delay(10); //比较值加一 pulse++; //设置比较值 __hal_tim_set_compare(&htim1, tim_channel_4, pulse); //如果比较值达到最大值499,就改变方向为递减 if (pulse == 499) { dir = 1; } } else if (dir == 1) { //延时10毫秒 hal_delay(10); //比较值减一 pulse--; //设置比较值 __hal_tim_set_compare(&htim1, tim_channel_4, pulse); //如果比较值达到最小值0,就改变方向为递增 if (pulse == 0) { dir = 0; } } } /* user code end 3 */}实验现象
能在我的硬件上实现呼吸灯的效果。
本文完!
苹果降速门之后 三星Note 8电池故障又被曝光
亚马逊AWS C6g开放服务,性能是第一代的最多7倍
一种快速的公交专用车道检测方法
硬盘的选择技巧,西数蓝盘和黑盘的区别
【开箱】售价仅百元的人脸识别开发板,Espressif ESP-EYE
基于HAL库的STM32呼吸灯实验
特瑞仕半导体推出升压与反转DC/DC转换器XC9519系列
AI技术如何助力居家办公
IBM2016年登顶了,拿下超过7,000项专利,连续 24 年蝉联美国科技公司专利冠军
箱式变电站安全距离_箱式变电站优缺点
宏正自动科技提供全新HDMI信号延长器
千元级扫地机器人 大揭秘!
美国出台终极封杀令!美国升级华为芯片限制
爱特梅尔低功耗微控制器平台以增强之QTouch开发组合软件加
振动传感器原理与应用知识
为吸引年轻车主,伊兰特新将搭载自动驾驶智能化技术
四个迹象表明企业组织需要尽快更新混合云战略
日本产业衰落给中国的思考
ISO 11998;耐檫洗磨耗仪的测试原理介绍
三星测试首款搭载Android Go系统的手机