高中生
最后登录1970-1-1
在线时间 小时
注册时间2021-5-9
|
舵机控制函数server.c
#include "server.h"
/*
* 舵机驱动文件
*/
/*
* 函数名:SG90_GPIO_Config
* 描述 :配置SG90用到的I/O口
* 输入 :无
* 输出 :无
*/
void SG90_GPIO_Config ( void )
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*开启SG90_GPIO_PORT的外设时钟*/
SG90_SCK_APBxClock_FUN ( SG90_GPIO_CLK , ENABLE );
/*选择要控制的DHT11_Dout_GPIO_PORT引脚*/
GPIO_InitStructure.GPIO_Pin = SG90_GPIO_PIN;
/*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,初始化DHT11_Dout_GPIO_PORT*/
GPIO_Init ( SG90_GPIO_PORT , &GPIO_InitStructure );
}
void SG90_TIM8_PWM_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE); // 开启定时器时钟,即内部时钟CK_INT=72M
TIM_TimeBaseStructure.TIM_Period= (200-1); //自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
TIM_TimeBaseStructure.TIM_Prescaler= (7200-1); //驱动CNT计数器的时钟 = Fck_int/(psc+1)
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //时钟分频因子 ,用于配置死区时间,没用到,随意
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数器计数模式,设置为向上计数
TIM_TimeBaseStructure.TIM_RepetitionCounter=0; //重复计数器的值,没用到,可以随意设置
TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //初始化定时器
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出使能
TIM_OCInitStructure.TIM_Pulse = 0; //设置占空比大小,在主函数compare中又设置一遍
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出通道电平极性配置
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; //输出通道空闲电平极性配置
TIM_OC1Init(TIM8, &TIM_OCInitStructure); //初始化通道1
TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable); //使能通道1输出
TIM_Cmd(TIM8, ENABLE); //使能计数器
TIM_CtrlPWMOutputs(TIM8, ENABLE); // 主输出使能,当使用的是通用定时器时,这句不需要
}
舵机控制函数头文件server.h
#ifndef __SERVER_H
#define __SERVER_H
#include "bsp_led.h"
/*
* 舵机驱动头文件
*/
/************************** SG90 连接引脚定义********************************/
#define SG90_SCK_APBxClock_FUN RCC_APB2PeriphClockCmd
#define SG90_GPIO_CLK RCC_APB2Periph_GPIOC
#define SG90_GPIO_PORT GPIOC
#define SG90_GPIO_PIN GPIO_Pin_6
void SG90_GPIO_Config ( void );
void SG90_TIM8_PWM_Init(void);
#endif /*__SERVER_H*/
舵机控制主函数main.c
/**
******************************************************************************
* @file main.c
* @author fire
* @version V1.0
* @date 2013-xx-xx
* @brief dht11温湿度传感器测试实验
******************************************************************************
* @attention
*
* 实验平台:野火 霸道 STM32 开发板
* 舵机红色线 --> 5V
* 舵机棕色线 --> GND
* 舵机橙色线 --> GPIO_Pin_6
******************************************************************************
*/
//#include "stm32f10x.h"
//#include "./systick/bsp_SysTick.h"
//#include "./dht11/bsp_dht11.h"
//#include "./usart/bsp_usart.h"
//#include "./lcd/bsp_ili9341_lcd.h"
#include "bsp_led.h"
//#include "hcsr501.h"
#include "delay.h" //延时驱动文件
#include "server.h" //舵机驱动文件
/*以下函数为360度舵机的正向转动、停止、反向转动的测试函数
* PWM 信号与360舵机转速的关系:
* 0.5ms ---------------- 正向最大转速
* 1.5ms ---------------- 速度为0
* 2.5ms ---------------- 反向最大转速
* 舵机频率与占空比的计算:
* 设舵机的频率为50HZ,则PWM周期为20ms,0度对应的占空比为2.5%,即0.05ms的高电平输出。
*/
//360度舵机测试函数
void Server_360_Forward(void)
{
TIM_SetCompare1(TIM8,5);//0.5ms --> 正向最大转速
delay_ms(50000);
TIM_SetCompare1(TIM8,15);//1.5ms --> 速度为0
delay_ms(50000);
TIM_SetCompare1(TIM8,25);//2.5ms --> 反向最大转速
delay_ms(50000);
}
/*****************************************END****************************************/
/************************************************************************************/
/*以下函数为0-180度舵机角度控制测试函数
* PWM 信号与0-180舵机的关系:
* 0.5ms ---------------- 0度
* 1ms ---------------- 45度
* 1.5ms ---------------- 90度
* 2ms ---------------- 135度
* 2.5ms ---------------- 180度
* 舵机频率与占空比的计算:
* 设舵机的频率为50HZ,则PWM周期为20ms,0度对应的占空比为2.5%,即0.05ms的高电平输出。
*/
//0-180度舵机 --> 0-90-180度控制函数
void Server_180_Angle(void)
{
TIM_SetCompare1(TIM8,5);//0度
delay_ms(1000);
TIM_SetCompare1(TIM8,15);//90度
delay_ms(1000);
TIM_SetCompare1(TIM8,25);//180度
delay_ms(1000);
}
/*****************************************END****************************************/
/**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
delay_init(); //延时初始化
SG90_GPIO_Config (); //舵机初始化
SG90_TIM8_PWM_Init();
while(1)
{
Server_360_Forward();//360度测试
}
}
/*********************************************END OF FILE**********************/
请大佬帮忙看看是怎么搞得?为什么修改引脚会无法使用呢?
|
|