野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 181|回复: 2

关于学习SG90的一些问题

[复制链接]
发表于 2024-1-3 10:02:15 | 显示全部楼层 |阅读模式
舵机控制函数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**********************/




请大佬帮忙看看是怎么搞得?为什么修改引脚会无法使用呢?

3-SG90 - 副本.zip

7.33 MB, 下载次数: 2

SG90经典舵机控制

回复

使用道具 举报

发表于 2024-1-4 10:14:41 | 显示全部楼层
sg90就普通的pwm控制的,看你说的你换了脚,你换的脚有对照过数据手册没,是否是可以输出pwm的,你实际改了后你有测一下脚是否有输出PWM嘛
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-6 09:40:11 | 显示全部楼层
菠萝片 发表于 2024-1-4 10:14
sg90就普通的pwm控制的,看你说的你换了脚,你换的脚有对照过数据手册没,是否是可以输出pwm的,你实际改了 ...

好的,谢谢,我之前没注意到这个,现在去看看

2024年1月6日09:40:09
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-1 06:10 , Processed in 0.130394 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表