许戈. 2023-11-21 21:53 采纳率: 25%
浏览 5

按键使舵机旋转的代码

想编辑了一个用按键使舵机旋转的代码(用stm32f103zet6单面机库函数),但是舵机不动.

pwm文件
#include "stm32f10x.h"
#include "stm32f10x_tim.h"
#include "stdint.h"
#include "led.h"

void TIM2_PWM_init(uint16_t arr,uint16_t psc)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
    GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2,ENABLE);
    GPIO_InitTypeDef GPIO_InitHHH;
    
    GPIO_InitHHH.GPIO_Mode=GPIO_Mode_AF_PP;
    
  GPIO_InitHHH.GPIO_Pin=GPIO_Pin_3;
    
  GPIO_InitHHH.GPIO_Speed=GPIO_Speed_50MHz;
    
  GPIO_Init(GPIOB,&GPIO_InitHHH);
    
    TIM_InternalClockConfig(TIM2);
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    
    NVIC_InitTypeDef PPPP;
    
    PPPP.NVIC_IRQChannel=TIM2_IRQn;
    
  PPPP.NVIC_IRQChannelCmd=ENABLE;
    
    PPPP.NVIC_IRQChannelPreemptionPriority=0;
    
    PPPP.NVIC_IRQChannelSubPriority=3;
    
    NVIC_Init(&PPPP);
    
    TIM_TimeBaseInitTypeDef HHHH;
    
    HHHH.TIM_ClockDivision=TIM_CKD_DIV1;
    
    HHHH.TIM_CounterMode=TIM_CounterMode_Up;
    
    HHHH.TIM_Period=arr;
    
    HHHH.TIM_Prescaler=psc;
    
    HHHH.TIM_RepetitionCounter=0;
    
    TIM_TimeBaseInit(TIM2,&HHHH);
    
    TIM_OCInitTypeDef OOOO;
    
    TIM_OCStructInit(&OOOO);
        
    OOOO.TIM_OCMode=TIM_OCMode_PWM2;
    
    OOOO.TIM_OCPolarity=TIM_OCPolarity_Low;
    
    OOOO.TIM_OutputState=TIM_OutputNState_Enable;
    
    OOOO.TIM_Pulse=0;
    
    TIM_OC2Init(TIM2,&OOOO);
    
  TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);
    
    TIM_Cmd(TIM2,ENABLE);
}
舵机文件
#include "stm32f10x.h"
#include "PWM.h"
#include "stm32f10x.h"                  // Device header
#include "stm32f10x_tim.h"


void steering_init(void)
{
   TIM2_PWM_init(199,7199);
}
void steering_angle(float angle)
{
  TIM_SetCompare2(TIM2,angle/180*2000+500);

}
主函数
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "stm32f10x.h"
#include "led.h"
#include "key.h"
#include "stdint.h"
#include "stm32f10x_tim.h"
#include "steering.h"
#include "key.h"


 float angle;
uint8_t key;
 int main(void)
 {        
     key_init();
     steering_init();
    steering_angle(90);
    uint8_t key1();
    while(1)
    {
        key = key1();
         if(key==1)
         {
         angle += 30;
         if (angle>=180)
             {
                     angle=0; 
             }
         }
        steering_angle(angle);key = key1();
         if(key==1)
         {
         angle += 30;
         if (angle>=180)
             {
                     angle=0; 
             }
         }
        steering_angle(angle);
    }
    
    }

各位看看我错哪了qwq

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-22 08:13
    关注

    【以下回答由 GPT 生成】

    问题分析:

    从代码中来看,有以下几个问题: 1. 需要初始化TIM2定时器来产生PWM信号,但是代码中没有对TIM2进行具体的初始化操作。 2. TIM2_PWM_init函数内部没有具体的初始化PWM的代码。

    解决方案: 1. 对题目中给出的代码进行修改,添加具体的初始化操作。 2. 增加一个函数用于实现舵机旋转的代码。

    修改后的代码如下:

    #include "stm32f10x.h"
    #include "stm32f10x_tim.h"
    #include "stdint.h"
    #include "led.h"
    
    void TIM2_PWM_init(uint16_t arr, uint16_t psc)
    {
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
        TIM_OCInitTypeDef TIM_OCInitStruct;
    
        TIM_TimeBaseInitStruct.TIM_Period = arr - 1;
        TIM_TimeBaseInitStruct.TIM_Prescaler = psc - 1;
        TIM_TimeBaseInitStruct.TIM_ClockDivision = 0;
        TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
    
        TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
        TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
    
        TIM_OC1Init(TIM2, &TIM_OCInitStruct);
        TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
    
        TIM_Cmd(TIM2, ENABLE);
    }
    
    void GPIO_init()
    {
        GPIO_InitTypeDef GPIO_InitStruct;
    
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    
        GPIO_Init(GPIOA, &GPIO_InitStruct);
    }
    
    void servo_rotate(uint16_t angle)
    {
        uint16_t pulse_width;
    
        pulse_width = (angle * 2000) / 180 + 500;    // 角度转换为脉冲宽度
    
        TIM2->CCR1 = pulse_width;   // 设置PWM信号的脉冲宽度
    }
    
    int main(void)
    {
        TIM2_PWM_init(20000, 72);   // 假设arr = 20000, psc = 72
        GPIO_init();
    
        while (1)
        {
            if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == RESET)
            {
                servo_rotate(0);   // 按钮按下时,舵机旋转到0度
            }
            else
            {
                servo_rotate(90);  // 按钮松开时,舵机旋转到90度
            }
        }
    }
    

    这样修改后的代码将会初始化TIM2定时器并产生PWM信号,然后通过按键控制舵机旋转到不同的角度。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 11月21日

悬赏问题

  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错
  • ¥15 换yum源但仍然用不了httpd
  • ¥50 C# 使用DEVMOD设置打印机首选项
  • ¥15 麒麟V10 arm安装gdal