2021/10/15 智慧傢俱 嵌入式實訓 第五天 relay 繼電器 motor 電機
阿新 • • 發佈:2021-10-18
繼電器 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關閉 #defineRELAY_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); }