1. 程式人生 > 其它 >2021/10/15 智慧傢俱 嵌入式實訓 第五天 relay 繼電器 motor 電機

2021/10/15 智慧傢俱 嵌入式實訓 第五天 relay 繼電器 motor 電機

繼電器 relay

delay.h

#ifndef _RELAY_H_
#define _RELAY_H_

#include "stm32f10x.h"
#include "stdio.h"
#include "led.h"

/* 管腳巨集定義 */
#define RELAY_PORT    GPIOA
#define RELAY_PIN    11
/* 操作巨集定義 */
#define RELAY(x)        (x)?GPIO_SetBits(RELAY_PORT,GPIO_Pin_11):GPIO_ResetBits(RELAY_PORT,GPIO_Pin_11) //1-開啟 0關閉
#define
RELAY_TOGGLE (RELAY_PORT->ODR ^= (1 << RELAY_PIN)) /* 繼電器狀態封裝 */ extern char Relay_statue[4]; /* 函式介面 */ void Relay_Config(void); void Relay_Getstatue(void); #endif

實現函式功能 寫delay.c

先使能

#include "relay.h"

char Relay_statue[4] = {0};//開始狀態位為0 關閉
/***********************************************************************************
函式功能: relay初始化
形參:
返回值:無
**********************************************************************************
*/ /* 管腳: relay -- PA11(通用推輓輸出) */ void Relay_Config(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11; GPIO_Init(GPIOA,
&GPIO_InitStruct); }

獲取繼電器

/*
* 獲取繼電器狀態
*/
void Relay_Getstatue(void)
{
    uint8_t statue = GPIO_ReadOutputDataBit(RELAY_PORT,GPIO_Pin_11);
    if(statue == 0)
        sprintf(Relay_statue,"OFF");
    else if(statue == 1)
        sprintf(Relay_statue,"ON");
}

在主函式中呼叫Relay_Getstatue

執行繼電器

電機 motor

#ifndef _MOTOR_H_
#define _MOTOR_H_

#include "stm32f10x.h"
#include "led.h"

/* 管腳巨集定義 */
#define IA_PORT    GPIOB
#define IA_PIN    9
#define IB_PORT    GPIOB
#define IB_PIN    8

/* 操作巨集定義 */
enum MOTOR_WORKMODE{GO=0,BACK,STOP};
#define IA(x) (x)?GPIO_SetBits(IA_PORT,GPIO_Pin_9):GPIO_ResetBits(IA_PORT,GPIO_Pin_9) // ON -- 開啟 , OFF -- 關閉
#define IB(x) (x)?GPIO_SetBits(IB_PORT,GPIO_Pin_8):GPIO_ResetBits(IB_PORT,GPIO_Pin_8)

#define Motor_IA_PWM(x)  TIM_SetCompare3(TIM4,x)
#define Motor_IB_PWM(x)  TIM_SetCompare4(TIM4,x)
/* 函式介面 */
void Motor_Config(void);
void TIMx_Config(uint32_t RCC_APB1Periph_TIMx,TIM_TypeDef* TIMx);
void Motor_Setmode(u8 mode,u16 speed);
void Motor_Test(void);
#endif

motor.c

#include "motor.h"

/***********************************************************************************
函式功能: motor初始化
形參:
返回值:無
作者:XYD_ZH
時間:2021年9月7日16:22:52
***********************************************************************************/
/*
    管腳:
    IA -- PB9 TIM4_CH3(通用推輓輸出)
    IB -- PB8 TIM4_CH4(通用推輓輸出)
*/
void Motor_Config(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
//    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//PWM波控制速度
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
    GPIO_Init(GPIOB,&GPIO_InitStruct);    
    TIMx_Config(RCC_APB1Periph_TIM4,TIM4);
}
/****************************
函式名稱:TIMx_Config
函式作用:TIMx初始化
函式入口:無
函數出口:無
****************************/
void TIMx_Config(uint32_t RCC_APB1Periph_TIMx,TIM_TypeDef* TIMx)
{    
    //定時器時鐘使能
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMx,ENABLE);
    TIM_TimeBaseInitTypeDef TIM_BaseInitStructure = {0};
    TIM_BaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;        //分頻因子
    TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;    //向上計數
    TIM_BaseInitStructure.TIM_Period = 999;    //重灌載值
    TIM_BaseInitStructure.TIM_Prescaler = 71;    //預分頻器
    TIM_TimeBaseInit(TIMx,&TIM_BaseInitStructure);
    TIM_ARRPreloadConfig(TIMx,ENABLE);    //ARR影子暫存器
    //輸出比較配置
    TIM_OCInitTypeDef TIM_OCInitStructure = {0};
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                //PWM1
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;        //極性:高電平有效
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;    //輸出到對應引腳
    TIM_OCInitStructure.TIM_Pulse = 0;                                //佔空比:0
    TIM_OC3Init(TIMx,&TIM_OCInitStructure);    
    TIM_OC4Init(TIMx,&TIM_OCInitStructure);
    
    TIM_OC3PreloadConfig(TIMx,ENABLE);      //CCR3影子暫存器
    TIM_OC4PreloadConfig(TIMx,ENABLE);      //CCR4影子暫存器
    
    //定時器使能
    TIM_Cmd(TIMx,ENABLE);    
}
/***********************************************************************************
函式功能: motor函式介面
形參:
返回值:無
作者:XYD_ZH
時間:2021年9月7日16:22:52
***********************************************************************************/
/*
*控制電機工作模式
*/
void Motor_Setmode(u8 mode,u16 speed)
{
    switch(mode)
    {
        case GO:    IA(ON);IB(OFF); break;
        case BACK:  IA(OFF);IB(ON);break;
        //PWM波控制速度
//        case GO:    Motor_IA_PWM(speed); IB(OFF); break;
//        case BACK:  IA(OFF);Motor_IB_PWM(speed);break;
        case STOP:  IA(OFF);IB(OFF);break;
        default:    break;
    }
}
/*
*電機測試
*/
void Motor_Test(void)
{
   Motor_Setmode(GO,800);
   Delay_nop_nms(500);
   Motor_Setmode(BACK,800);
   Delay_nop_nms(500);
   Motor_Setmode(STOP,0);
   Delay_nop_nms(500);
}