智能小家居------舵机开门,电机做风扇 or 拉窗帘、呼吸灯做提示,小OLED屏幕显示当前状态。
直接上代码
背景:
我觉得我看了那么多教程了,然而只会玩单个东西,串起来就不太懂。
本项目的代码部分实现用到了2个时钟
,TIM2 和 TIM3。
经历的问题:
原本我是想只用一个时钟,不同通道来实现PWM的输出,但是我发现 我如果把TIM_TimeBaseInitStructure.TIM_Period = ARR ; //ARR 自动重装器的值
ARR = 20000 -1 时,只能驱动舵机,不能驱动电机。
ARR = 100 -1 时,只能驱动电机,不能驱动舵机。
后来发现:
SG90舵机接收的PWM信号频率为50HZ,T=1/f,所以周期为20ms。 当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。
解决方案:
所以后来使用了2个时钟,分别输出上面这2个ARR的PWM。
明天准备再加一个呼吸灯功能
。
如果你有更好的方案,可以留言或者私信我哦,我们可以交流交流哈哈哈,一起进步呀。
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
#include "OLED.h"
#include "Servo.h"
#include "PWM.h"
#include "Motor.h"
extern void Motor_Set_Dir(int8_t Speed);
extern void Exti_Test_Pull_Level_Set(void);
//extern void PWM_SetCompare3(uint16_t Compare);
uint8_t i,KeyNum;
int main(void)
{
Key_Init();
OLED_Init();
Servo_Init();
Motor_Init();
OLED_ShowString(1,1,"Angle:");
OLED_ShowString(2,1,"KeyNum:");
OLED_ShowString(3,1,"Speed:");
Servo_Set_Angle(0);//设置舵机初始角度
while (1)
{
KeyNum = Key_GetNum();
Servo_Turn(KeyNum);
Motor_Speed_Set(KeyNum);
}
}
pwm.h
#ifndef __PWM_H
#define __PWM_H
#include "stm32f10x.h" // Device header
void Servo_PWM_Init