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