出问题的原因:
#####Main
#include "stm32f10x.h" // Device header
#include "led.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "servo.h"
extern uint8_t Key_GetNum(void);
uint8_t KeyNum;
float Angle;
int main(void)
{
// LCD_Init();
KEY_Init();
servo_Init();
set_angle(0);
// pwm_compare(2500);//500转到0度 2500转到180度
while (1)
{
KeyNum = Key_GetNum();
if (KeyNum == 1)
{
Angle += 30;
if (Angle > 180)
{
Angle = 0;
}
}
set_angle(Angle);
}
}//按下按键可使舵机转动
#include "stm32f10x.h" // Device header
void pwm_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//time2在APB1里面
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA端口时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //GPIO_Mode_AF_PP 复用推挽输出,定时器控制引脚,引脚的
//控制权交给片上外设
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
TIM_InternalClockConfig(TIM2) ;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_Prescaler = 72-1;//分频器值,72M/7200 = 10K PSC
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
TIM_TimeBaseInitStruct.TIM_Period =20000-1; //自动寄存器的值(定时器的周期)相乘结果为1秒 ARR
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//分频为1
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0 ;//高级计时器才有
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
//REF的配置
TIM_OCInitTypeDef TIM_OCInitStruct;
TIM_OCStructInit(&TIM_OCInitStruct); //给结构体赋初始值,避免缺少成员而报错 //带N的一般是高级定时器才有的功能
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; // 输出比较模式选择 PW1
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_Pulse = 0; //CCR的值
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; //极性选择
TIM_OC2Init(TIM2,&TIM_OCInitStruct);
// TIM_OC2Init(TIM2,&TIM_OCInitStruct);可以实现同一个定时器,不同通道的PWM可以驱动多个舵机
// TIM_OC3Init(TIM2,&TIM_OCInitStruct);
// TIM_OC4Init(TIM2,&TIM_OCInitStruct);
TIM_Cmd(TIM2,ENABLE);//启动定时器
}
void pwm_compare(uint16_t Compare)
{
TIM_SetCompare2(TIM2,Compare);//不断更改CCR的值
}
#include "stm32f10x.h" // Device header
#include "pwm.h"
void servo_Init(void)
{
pwm_Init();
}
//0 180
//500 2500
void set_angle(float angle)
{
pwm_compare(angle/180*2000+500);//可选择想要的角度
}