main.c
#include "stm32f10x.h" // Device header
#include "OLED.h"
#include "servo.h"
#include "key.h"
int8_t key;
float angle;
float angleshow;
int main(void)
{
OLED_Init();//初始化外设
key_init();
servo_init();
while(1)//死循环
{
key=key_getnumber();
if(key==1)
{
angle+=30;
angleshow+=30;
if(angle>180&&angle<360)
{
angle=30;
}
if(angleshow==360)
{
angleshow=0;
angle=0;
}
}
servo_setangle(angle);
OLED_ShowString(1,1,"angle:");
OLED_ShowNum(1,7,angleshow,3);
}
}
servo.c
#include "stm32f10x.h" // Device header
void servo_init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//通用计时器tim2是apb1总线的外设,故开启apb1的rcc时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启gpio_a时钟
/*引脚重映射
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);//启用部分重映射1(pa0→pa15;pa1→pb3)
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//解除JTAG的赋用,可使pa15、pb3、pb4做普通gpio使用
*/
GPIO_InitTypeDef GPIO_InitStruct;//定义结构体 初始化gpio中一参数
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出 引脚控制来自片上外设,pwm通过引脚输出
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;//使用gpio_a0 tim2引脚查看引脚配置图
//GPIO_InitStruct.GPIO_Pin=GPIO_Pin_15;//引脚重映射至pa15
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);//初始化gpio
//配置时基单元
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;//定义结构体 初始化时基单元中一参数
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//滤波器采样频率 选用一分频
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
TIM_TimeBaseInitStruct.TIM_Period=20000-1;//周期 arr
TIM_TimeBaseInitStruct.TIM_Prescaler=72-1;//预分频器 psc
//定时频率=72m/(psc+1)/(arr+1)定时一秒即一赫兹=72m/10000/7200
//注:psc和arr取值范围[0~65535]
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;//重复计数器 高级定时器中用
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);//初始化
//配置输出比较单元
TIM_OCInitTypeDef TIM_OCInitStruct;//定义结构体 初始化输出比较单元中一参数
TIM_OCStructInit(&TIM_OCInitStruct);//所有结构体变量赋初始值
//之后,根据使用的定时器类型针对部分变量进行修改(通用计时器tim2只需用到结构体的部分参数,其余参数在高级定时器中使用)
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;//输出比较模式
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;//输出比较极性
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;//设置输出使能
TIM_OCInitStruct.TIM_Pulse=500;//设置ccr 舵机角度归零
//频率=72m/(psc+1)/(arr+1) 占空比=ccr/(arr+1) 分辨率=1/(arr+1)
TIM_OC1Init(TIM2, &TIM_OCInitStruct);
TIM_Cmd(TIM2, ENABLE);//启动定时器
}
void servo_setangle(float angle)//驱动舵机转至angle角度
{
TIM_SetCompare1(TIM2, angle/180*2000+500);
}
servo.h
#ifndef __servo_h
#define __servo_h
void servo_init(void);
void servo_setangle(float angle);
#endif
key模块前有介绍
OLED模块前有介绍
运行效果
pwm驱动舵机
4082

被折叠的 条评论
为什么被折叠?



