ATK-MB023模块使用说明
这里以正点原子M48Z-M3最小系统板STM32F103版为例,给大家介绍一下模块和板卡的连接方法。其它板卡与模块的硬件连接方法,请大家在“ATK-MB0023小风扇模块\3,程序源码\相应板卡例程文件夹\readme.txt”路径下查看。
小风扇模块可通过杜邦线与正点原子M48Z-M3最小系统板STM32F103版进行连接,具体的连接关系,如下表所示:

表1.1小风扇模块与M48Z-M3最小系统板STM32F103版连接关系
在本实验中,串口会打印实验提示信息。需要查看这部分实验信息的用户,可用杜邦线将最小系统板STM32F103的PA9引脚和GND连接至外部的USB转串口设备,这样就可以通过XCOM上位机查看串口打印的信息了。
小风扇控制方法:当按下KEY0反转加速,按下WKUP正转加速。
开发板的LED0闪烁,提示程序运行。
打开本实验的工程文件夹,能够在./Drivers/BSP目录下看到ATK_FAN文件夹和TIM文件夹,其中ATK_FAN文件夹中就包含了小风扇模块的驱动文件,TIM文件夹中就包含了定时器的驱动文件如下图所示:

图2.1.2.1小风扇模块驱动代码

图2.1.2.2 定时器驱动代码
下面简要介绍atk_fan.c中几个重要的API 函数。
1. 函数atk_fan_init ()
该函数用于初始化小风扇模块,具体的代码,如下所示:
/**
* @brief 风扇模块初始化函数
* @param 无
* @retval 无
*/
void atk_fan_init(void)
{
atim_timx_cplm_pwm_init(50 - 1, 72 - 1); /* 1Mhz的计数频率,20Khz的PWM */
atk_fan_stop();
}
该函数调用atim_timx_cplm_pwm_init () 函数初始化定时器相关通道,用于输出互补的PWM。
2. 函数atk_fan_stop ()
该函数用于停止电机转动,具体代码,如下所示:
/**
* @brief 电机停止
* @param 无
* @retval 无
*/
void atk_fan_stop(void)
{
/* 关闭主通道输出 */
HAL_TIM_PWM_Stop(&g_timx_cplm_pwm_handle, TIM_CHANNEL_1);
/* 关闭互补通道输出 */
HAL_TIMEx_PWMN_Stop(&g_timx_cplm_pwm_handle, TIM_CHANNEL_1);
}
该函数通过HAL_TIM_PWM_Stop ()和HAL_TIMEx_PWMN_Stop()函数停止主通道和互补通道的输出。
3. 函数atk_fan_dir ()
该函数用于控制电机旋转方向,具体代码,如下所示:
/**
* @brief 电机旋转方向设置
* @param para:方向 0正转,1反转
* @note 以电机正面,顺时针方向旋转为正转
* @retval 无
*/
void atk_fan_dir(uint8_t para)
{
/* 关闭主通道输出 */
HAL_TIM_PWM_Stop(&g_timx_cplm_pwm_handle, TIM_CHANNEL_1);
/* 关闭互补通道输出 */
HAL_TIMEx_PWMN_Stop(&g_timx_cplm_pwm_handle, TIM_CHANNEL_1);
if (para == 0) /* 正转 */
{
/* 开启主通道输出 */
HAL_TIM_PWM_Start(&g_timx_cplm_pwm_handle, TIM_CHANNEL_1);
}
else if (para == 1) /* 反转 */
{
/* 开启互补通道输出 */
HAL_TIMEx_PWMN_Start(&g_timx_cplm_pwm_handle, TIM_CHANNEL_1);
}
}
该函数可控制电机正转或者反转。
4. 函数atk_fan_set_speed ()
该函数用于控制电机转动速度,具体代码,如下所示:
/**
* @brief 电机速度设置
* @param para:比较寄存器值
* @retval 无
*/
void atk_fan_set_speed(uint16_t para)
{
if (para < (__HAL_TIM_GetAutoreload(&g_timx_cplm_pwm_handle))) /* 限速 */
{
__HAL_TIM_SetCompare(&g_timx_cplm_pwm_handle, TIM_CHANNEL_1, para);
}
}
该函数通过控制PWM的占空比实现控制电机转动速度。
5. 函数atk_fan_pwm_set ()
该函数用于控制电机转动,具体代码,如下所示:
/**
* @brief 电机控制
* @param para: pwm比较值 ,正数电机为正转,负数为反转
* @note 根据传入的参数控制电机的转向和速度
* @retval 无
*/
void atk_fan_pwm_set(float para)
{
int val = (int)para;
if (val >= 0)
{
atk_fan_dir(0); /* 正转 */
atk_fan_set_speed(val);
}
else
{
atk_fan_dir(1); /* 反转 */
atk_fan_set_speed(-val);
}
}
该函数可控制电机正反转,以及转动速度。
在图2.1.2.2中,atim.c 和 atim.h 为 定时器驱动文件,包含了定时器通道的初始化,并初始化定时器互补输出功能。关于定时器互补通道输出的驱动介绍,请查看正点原子各个开发板对应的开发指南中高级定时器章节。
实验的测试代码在demo.c文件中,该文件在工程根目录下的 User文件夹。测试代码的入口函数为 demo_run(),具体的代码,如下所示:
#define MAX_SPEED 50 /* 限制比较值 即最大速度 */
/**
* @brief 例程演示入口函数
* @param 无
* @retval 无
*/
void demo_run(void)
{
uint8_t key, t;
int32_t pwm_val = 0;
key_init(); /* 初始化按键 */
atk_fan_init(); /* 初始化风扇模块 */
while (1)
{
key = key_scan(1); /* 支持连按,效果更顺滑 */
if(key == KEY0_PRES) /* 减速 */
{
pwm_val -= 1;
if(pwm_val <= -MAX_SPEED)
{
pwm_val = -MAX_SPEED;
}
atk_fan_pwm_set(pwm_val);
}
else if(key == WKUP_PRES) /* 加速 */
{
pwm_val += 1;
if(pwm_val >= MAX_SPEED)
{
pwm_val = MAX_SPEED;
}
atk_fan_pwm_set(pwm_val);
}
delay_ms(10);
t++;
if(t % 50 == 0)
{
t = 0;
LED0_TOGGLE();
}
}
}
从上面代码可以看出,整个测试代码的逻辑相对简单。首先,初始化小风扇模块后,在while循环中调用按键扫描函数,通过键值控制电机正反转和转速。最后,LED0闪烁表示程序正常运行。
将小风扇模块按照第一节“硬件连接”中介绍的连接方式与开发板连接,并将实验代码编译烧录至开发板中。本实验使用串口输出调试信息,因此需将开发板的 PA9连接至 DAP 虚拟串口(或 USB 转 TTL 模块)的 RX引脚。完成连接后,可通过串口调试助手XCOM查看实验信息输出,如下图所示:

图2.1.3.1 串口调试助手显示内容
注:其它现象请看2.1.1功能说明。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70040860/viewspace-3081985/ ,如需转载,请注明出处,否则将追究法律责任。