智能颈部按摩仪设计——3.功能模式实现

本文详细介绍了电脉冲按摩仪的工作原理,通过控制P9和P24两个IO口产生不同模式的电脉冲,实现舒缓、活力、锤击拍打、刮痧和智能五种按摩模式。每个模式通过调整脉冲时间间隔来区别,代码中使用PWM波形控制,并通过延时函数实现模式切换。虽然存在精度误差,但能有效模拟不同按摩效果。
摘要由CSDN通过智能技术生成
一、前言

按摩仪主要有物理按摩和电脉冲两种,本项目为电脉冲类型,其原理是通过电极感应金属片,用脉冲技术对颈椎进行刺激,从而缓解颈椎酸痛。
市场上按摩仪的常见功能主要有敲打、锤击、揉捏、针灸、推拿、刮痧、恒温热敷等,本项目中实现了舒缓、活力、锤击拍打、刮痧、智能五个模式。

1、原理图

各种模式的实现是通过P9和P24两个IO口控制三极管的通断从而产生电脉冲来实现。
在这里插入图片描述

2、波形图

P9和P24分别产生正占空比为26.5%,周期为1ms的PWM波,但不能同时为高电平,否则会烧毁三级管(需特别注意)。
一次产生四束PWM波后等待30ms再次产生四束波,循环往复即可实现舒缓模式的功能效果。
在这里插入图片描述
图中一个脉冲中有四束PWM波,其波形如上图所示。脉冲与脉冲之间的时间为30ms。
在这里插入图片描述

3、各模式实现原理

舒缓、活力、锤击拍打、刮痧、智能五个模式是通过脉冲之间的时间间隔来实现的,如下表:

模式脉冲时间间隔
舒缓模式30ms
活力模式20ms
锤击拍打模式40ms
刮痧模式50ms
智能模式随机产生20 30 40 50ms
4、功能代码

相关引脚初始化

void pattern_pin_init(void)
{
    gpio_set_func(PATTERN_PIN_A, AS_PWM1_N);
    gpio_set_func(PATTERN_PIN_B, AS_PWM5);
    gpio_set_func(HEAT_PIN, AS_GPIO);

    gpio_set_output_en(PATTERN_PIN_A, 1);
    gpio_set_output_en(PATTERN_PIN_B, 1);
    gpio_set_output_en(HEAT_PIN, 1);

    gpio_write(PATTERN_PIN_A, 0);
    gpio_write(PATTERN_PIN_B, 0);
//    gpio_write(HEAT_PIN, 1);

	//PWM0 1ms cycle  26.5% duty 	1000Hz  
	pwm_set_mode(PWM1_ID, PWM_NORMAL_MODE);
	pwm_set_clk(CLOCK_SYS_CLOCK_HZ, CLOCK_SYS_CLOCK_HZ);
	pwm_set_phase(PWM1_ID, 0);   //no phase at pwm beginning
	pwm_set_cycle_and_duty(PWM1_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (0 * CLOCK_SYS_CLOCK_1US) );
	pwm_polo_enable(PWM1_ID, 1);	//to enable the pwm polarity
	pwm_start(PWM1_ID);

	//PWM5 1ms cycle  26.5% duty	1000Hz  
	pwm_set_mode(PWM5_ID, PWM_NORMAL_MODE);
	pwm_set_clk(CLOCK_SYS_CLOCK_HZ, CLOCK_SYS_CLOCK_HZ);
	pwm_set_phase(PWM5_ID, 0);   //no phase at pwm beginning
	pwm_set_cycle_and_duty(PWM5_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (265 * CLOCK_SYS_CLOCK_1US) );

}

由于GPIO_PC1(PATTERN_PIN_A)与档位调节GPIO_PC2(BOOST_PIN)都用到了PWM功能且GPIO_PC1(PATTERN_PIN_A)引脚仅支持PWM_0通道,所以GPIO_PC2(BOOST_PIN)使用PWM_0通道,GPIO_PC1(PATTERN_PIN_A)使用AS_PWM1_N通道,这里我们只需要pwm_polo_enable(PWM1_ID, 1)将PWM极性改变一下就可以了。
在这里插入图片描述
控制PWM个数以及脉冲时间间隔都是通过延时来实现的难免会有误差,大家有更好的实现方式也可以提出来一起交流。由于SDK没有涉及到RTOS所以整个程序是跑在裸机上的,因此该函数执行时需放在while(1)大循环里面。

void switching_pattern(unsigned char pat)
{
	if (pat > 4) {
		TUYA_APP_LOG_ERROR("*********No such model!!!**********");
	}

	switch (pat) {
	case relieve:
		pwm_start(PWM5_ID);
		sleep_us(450);		// 延时480us,防止同时置高烧毁三极管
		pwm_set_cycle_and_duty(PWM1_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (265 * CLOCK_SYS_CLOCK_1US) );
		sleep_us(5 * TIME_MS);
		pwm_stop(PWM5_ID);
		pwm_set_cycle_and_duty(PWM1_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (0 * CLOCK_SYS_CLOCK_1US) );
		sleep_us(30 * TIME_MS);
		break;

	case vitality:
		pwm_start(PWM5_ID);
		sleep_us(450);
		pwm_set_cycle_and_duty(PWM1_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (265 * CLOCK_SYS_CLOCK_1US) );
		sleep_us(5 * TIME_MS);
		pwm_stop(PWM5_ID);
		pwm_set_cycle_and_duty(PWM1_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (0 * CLOCK_SYS_CLOCK_1US) );
		sleep_us(20 * TIME_MS);
		break;

	case hammering:
		pwm_start(PWM5_ID);
		sleep_us(450);
		pwm_set_cycle_and_duty(PWM1_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (265 * CLOCK_SYS_CLOCK_1US) );
		sleep_us(5 * TIME_MS);
		pwm_stop(PWM5_ID);
		pwm_set_cycle_and_duty(PWM1_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (0 * CLOCK_SYS_CLOCK_1US) );
		sleep_us(40 * TIME_MS);
		break;

	case scraping_therapy:
		pwm_start(PWM5_ID);
		sleep_us(450);
		pwm_set_cycle_and_duty(PWM1_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (265 * CLOCK_SYS_CLOCK_1US) );
		sleep_us(5 * TIME_MS);
		pwm_stop(PWM5_ID);
		pwm_set_cycle_and_duty(PWM1_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (0 * CLOCK_SYS_CLOCK_1US) );
		sleep_us(50 * TIME_MS);
		break;

	case intelligent:
		pwm_start(PWM5_ID);
		sleep_us(450);
		pwm_set_cycle_and_duty(PWM1_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (265 * CLOCK_SYS_CLOCK_1US) );
		sleep_us(5 * TIME_MS);
		pwm_stop(PWM5_ID);
		pwm_set_cycle_and_duty(PWM1_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (0 * CLOCK_SYS_CLOCK_1US) );
		sleep_us(((rand() % 4 + 2) * 10) * TIME_MS);	// 随机延时20/30/40/50ms
		break;
	default:
		break;
	}
	return;
}
  • 8
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
颈部按摩是一种可以缓解颈部疲劳和疼痛的电子产品,其主要原理是通过机械震动的方式来按摩颈部肌肉,从而提高血液循环、缓解肌肉疲劳、改善睡眠等。下面是一个基于STM32的颈部按摩设计实现步骤: 1. 硬件设计 首先,需要选择一款适合的STM32单片机作为控制芯片,同时还需要选择一些适合的电机和驱动模块。电机可以选择直流电机或者步进电机,驱动模块可以选择L298N或者A4988等。此外,还需要一些传感器,如加速度传感器、温度传感器等。 2. 硬件连接 将所选的电机和驱动模块连接到STM32单片机上,并将传感器连接到对应的引脚。需要注意的是,电机和驱动模块的电源需要稳定,电源电压一般为12V。 3. 软件设计 在软件设计方面,需要编写STM32的程序,实现控制电机的功能。首先需要初始化单片机的各个引脚,然后编写电机控制函数。在电机控制函数中,需要根据加速度传感器的数据来控制电机的转速和转向,从而实现按摩功能。 4. 界面设计 可以在按摩上加入一个液晶屏幕,用于显示一些状态信息,如电机转速、温度、按摩时间等。同时,也可以加入一些按键,用于控制按摩的开关、转速等。 5. 实现测试 完成硬件和软件设计后,需要对按摩进行测试。可以通过连接电源和按下开关,测试电机是否正常工作。同时,也需要测试加速度传感器和温度传感器的准确性。 总的来说,基于STM32的颈部按摩设计实现需要考虑硬件和软件两个方面,需要选择合适的电机、驱动模块和传感器,并编写相应的程序。完成后,还需要进行测试,确保按摩的正常工作。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值