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);
}

 

posted @ 2021-10-18 10:03  halfup  阅读(200)  评论(1编辑  收藏  举报