打印
[STM32F1]

模块化编程之STM32F10X_FAN

[复制链接]
246|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wailian1265k|  楼主 | 2022-12-31 22:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
 在单片机的应用中,遇到风扇是很正常的事情。例如简易的环境系统,若温度过高时,可以通过风扇来进行一定程度的降温。此外,也可以使用PWM对其进行控制。假设低电平是风扇不转动,高电平是风扇全速转动。那么占空比不同的PWM波便可以对风扇的转速进行控制。

FAN编程思路
  本文提及的风扇属于较为简易的一类,即通过高低电平就可驱动,因此也比较简单。

使用特权

评论回复
评论
wailian1265k 2022-12-31 22:39 回复TA
———————————————— 版权声明:本文为CSDN博主「CaewarfeneggerCao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_56286356/article/details/123352038 
沙发
wailian1265k|  楼主 | 2022-12-31 22:40 | 只看该作者
构建结构
1.构建风扇开关状态的枚举类型。
typedef enum
{
    FAN_ON  = 0,
    FAN_OFF = 1
}FAN_STATE;

使用特权

评论回复
板凳
wailian1265k|  楼主 | 2022-12-31 22:40 | 只看该作者
构建FAN的硬件结构体。
typedef struct __FAN_Hardware_TypeDef_Struct
{
    GPIO_TypeDef        *FAN_GPIOx;
    uint16_t             FAN_GPIO_Pin;
    uint32_t             FAN_RCC;
} FAN_Hardware_TypeDef_Struct;

使用特权

评论回复
地板
wailian1265k|  楼主 | 2022-12-31 22:41 | 只看该作者
构建FAN的参数结构体。
typedef struct __FAN_Parameter_TypeDef_Struct
{
    FAN_STATE             fan_state;
} FAN_Parameter_TypeDef_Struct;

使用特权

评论回复
5
wailian1265k|  楼主 | 2022-12-31 22:42 | 只看该作者
构建FAN的结构体。
typedef struct __FAN_TypeDef_Struct
{
    FAN_Hardware_TypeDef_Struct    FAN_Hardware;
    FAN_Parameter_TypeDef_Struct   FAN_Parameter;
} FAN_TypeDef_Struct;

使用特权

评论回复
6
wailian1265k|  楼主 | 2022-12-31 22:43 | 只看该作者
构建FAN的初始化结构体。
typedef struct __FAN_InitTypeDef_Struct
{               
    FAN_Hardware_TypeDef_Struct    FAN_Hardware;
    FAN_Parameter_TypeDef_Struct   FAN_Parameter;                       
}FAN_InitTypeDef_Struct;

使用特权

评论回复
7
wailian1265k|  楼主 | 2022-12-31 22:44 | 只看该作者
构建宏
构建默认参数
#define FAN_RCC_DEFAULT                 RCC_APB2Periph_GPIOC
#define FAN_GPIO_DEFAULT                GPIOC
#define FAN_GPIO_PIN_DEFAULT            GPIO_Pin_6
#define FAN_STATE_DEFAULT               FAN_OFF

使用特权

评论回复
8
wailian1265k|  楼主 | 2022-12-31 22:45 | 只看该作者
具体函数
1.使用默认参数填写初始化结构体。
void FAN_InitStruct(FAN_InitTypeDef_Struct *FANInitStruct)
{   
    /* Set the hardware */
    FANInitStruct->FAN_Hardware.FAN_RCC      = FAN_RCC_DEFAULT;
    FANInitStruct->FAN_Hardware.FAN_GPIOx    = FAN_GPIO_DEFAULT;
    FANInitStruct->FAN_Hardware.FAN_GPIO_Pin = FAN_GPIO_PIN_DEFAULT;
       
    /* Set the parameter */
    FANInitStruct->FAN_Parameter.fan_state   = FAN_STATE_DEFAULT;
}

使用特权

评论回复
9
wailian1265k|  楼主 | 2022-12-31 22:45 | 只看该作者
初始化具体的FAN。
void FAN_Init(FAN_TypeDef_Struct *FANInit,FAN_InitTypeDef_Struct *FANInitStruct)
{
    GPIO_InitTypeDef       GPIO_InitStructure;

    FANInit->FAN_Hardware.FAN_RCC      = FANInitStruct->FAN_Hardware.FAN_RCC;
    FANInit->FAN_Hardware.FAN_GPIOx    = FANInitStruct->FAN_Hardware.FAN_GPIOx;
    FANInit->FAN_Hardware.FAN_GPIO_Pin = FANInitStruct->FAN_Hardware.FAN_GPIO_Pin;

    FANInit->FAN_Parameter.fan_state   = FANInitStruct->FAN_Parameter.fan_state;       
  
    RCC_APB2PeriphClockCmd(FANInit->FAN_Hardware.FAN_RCC,ENABLE);
   
    GPIO_InitStructure.GPIO_Pin   = FANInit->FAN_Hardware.FAN_GPIO_Pin;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
   
    GPIO_Init(FANInit->FAN_Hardware.FAN_GPIOx,&GPIO_InitStructure);

    switch(FANInit->FAN_Parameter.fan_state)
        {
        case FAN_ON:
            GPIO_SetBits(FANInit->FAN_Hardware.FAN_GPIOx,FANInit->FAN_Hardware.FAN_GPIO_Pin);
            break;
        case FAN_OFF:
            GPIO_ResetBits(FANInit->FAN_Hardware.FAN_GPIOx,FANInit->FAN_Hardware.FAN_GPIO_Pin);
                    break;        
        default:
            GPIO_ResetBits(FANInit->FAN_Hardware.FAN_GPIOx,FANInit->FAN_Hardware.FAN_GPIO_Pin);
                    break;
    }
}

使用特权

评论回复
10
wailian1265k|  楼主 | 2022-12-31 22:47 | 只看该作者
使能特定的FAN。
void FAN_On(FAN_TypeDef_Struct *FANInit)
{
    FANInit->FAN_Parameter.fan_state = FAN_ON;
    GPIO_SetBits(FANInit->FAN_Hardware.FAN_GPIOx,FANInit->FAN_Hardware.FAN_GPIO_Pin);
}

使用特权

评论回复
11
wailian1265k|  楼主 | 2022-12-31 22:47 | 只看该作者
失能特定的FAN。
void FAN_Off(FAN_TypeDef_Struct *FANInit)
{
    FANInit->FAN_Parameter.fan_state = FAN_OFF;
    GPIO_ResetBits(FANInit->FAN_Hardware.FAN_GPIOx,FANInit->FAN_Hardware.FAN_GPIO_Pin);
}

使用特权

评论回复
12
wailian1265k|  楼主 | 2022-12-31 22:48 | 只看该作者
切换特定的FAN的状态。

void FAN_Toggle(FAN_TypeDef_Struct *FANInit)
{
    switch(FANInit->FAN_Parameter.fan_state)
    {
                    case FAN_ON:
                        FANInit->FAN_Parameter.fan_state = FAN_OFF;
                                GPIO_ResetBits(FANInit->FAN_Hardware.FAN_GPIOx,FANInit->FAN_Hardware.FAN_GPIO_Pin);
                                break;
            case FAN_OFF:
                        FANInit->FAN_Parameter.fan_state = FAN_ON;
                                GPIO_SetBits(FANInit->FAN_Hardware.FAN_GPIOx,FANInit->FAN_Hardware.FAN_GPIO_Pin);                                       
                        break;
                    default:
                FANInit->FAN_Parameter.fan_state = FAN_ON;
                                GPIO_SetBits(FANInit->FAN_Hardware.FAN_GPIOx,FANInit->FAN_Hardware.FAN_GPIO_Pin);                                    
                                break;
    }
}       

使用特权

评论回复
13
wailian1265k|  楼主 | 2022-12-31 22:49 | 只看该作者
写在后面
  这次偷个了懒,函数的返回值变成了void而不是ErrorStatus。也只考虑了高电平驱动的风扇这一种情况。并且也只写了一组灯,没有融入PWM。不过鉴于这一步比较简单,有需要的伙伴可以自行添加代码。若纯粹从使用角度出发,用之前PWM的文件也可以直接发挥驱动风扇的效果。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

372

帖子

0

粉丝