wx:嵌入式工程师成长日记
具体功能实现
当第一次按下按键KEY0时,OLED上的角度显示30,舵机转动30°;每按下一次按键OLED和舵机都改变30°,最后一次按下时,舵机直接转动180°回到最初的位置
STM32F103RCT6原理图
01
器件
STM32F103RCT6,OLED屏,七根杜邦线 ,SG90舵机
02
前后展示图
前展示图(开始位置0°)
此时,OLED屏上显示0°,舵机处在0°的位置
后展示图(转动至60°)
此时,OLED上显示60°,舵机处在60°的位置
知识介绍
TIM_Cmd
使能和失能外围设备(开启定时器时钟)
TIM_CtrlPWMOutputs()
使用PWM时,仅高级定时器必须开启这个,使能主输出,否则PWM将不能正常输出。其中高级定时器有TIM1和TIM8
SG90舵机控制原理
引脚定义及复用
以下三个图时STMF103系列的引脚定义图
举个例子:本文我们驱动GPIOA的Pin_1口,对应的时钟是TIM2,通道是CH1
PWM各参数值计算公式
PSC:预分频值
CCR:输出比较寄存器
TIM_RepetitionCounter()
只有在高级定时器才能用到
基本定时器:TIM6,TIM7
通用定时器:TIM2~TIM5
高级定时器:TIM1,TIM8
其中TIM1和TIM8的时钟是由APB2输出产生,其他则是由APB1输出产生
主函数代码(C语言)KEIL5实现
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Servo.h"
#include "Key.h"
uint8_t KeyNum;
float Angle;
int main(void)
{
OLED_Init();
Servo_Init();
Key_Init();
OLED_ShowString(1, 1, "Angle:");
while (1)
{
KeyNum = Key_GetNum();
if (KeyNum == 1)
{
Angle += 30;
if (Angle > 180)
{
Angle = 0;
}
}
Servo_SetAngle(Angle);
OLED_ShowNum(1, 7, Angle, 3);
}
}
工程文件请在前面vx处领取~
问题解答
Q
PWM调制定理需要用到哪些函数?
A
GPIO_InitTypeDef
TIM_TimeBaseInitTypeDef
TIM_OCInitTypeDef
TIM_SetCompare2