过ོ客͡ꦿ᭄888 2024-03-27 21:37 采纳率: 66.7%
浏览 26
已结题

stm32f103c8t6使用TIM4的PB9输出PWM波形没有反应,怎么解决啊?

问题:我是按着江协科技的PWM控制舵机来改变引脚的,但是舵机没有反应,这应该怎么改参数啊!
PWM.c文件

#include "stm32f10x.h"                  // Device header

void PWM_Init(void)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
    TIM_InternalClockConfig(TIM4);
    
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_Period = 20000 - 1;    //ARR
    TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;    //PSC
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
    
    TIM_OCInitTypeDef TIM_OCIniStructure;
    TIM_OCStructInit(&TIM_OCIniStructure);
    TIM_OCIniStructure.TIM_OCMode =TIM_OCMode_PWM1;    //输出比较模式
    TIM_OCIniStructure.TIM_OCPolarity =TIM_OCPolarity_High;
    TIM_OCIniStructure.TIM_OutputState =TIM_OutputState_Enable;
    TIM_OCIniStructure.TIM_Pulse =0;     //设置CCR
    TIM_OC4Init(TIM4, &TIM_OCIniStructure);//通道2
    
//    TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
    TIM_Cmd(TIM4,ENABLE);
}

void PWM_SetCompare4(uint16_t Compare)
{
    TIM_SetCompare4(TIM4, Compare);
}

PWM.h文件

#ifndef __PWM_H
#define __PWM_H

void PWM_Init(void);
void PWM_SetCompare4(uint16_t Compare);


#endif

舵机模块文件Servo.c

#include "stm32f10x.h"                  // Device header
#include "PWM.h"

void Servo_Init(void)
{
    PWM_Init();
}

void Servo_SetAngle(float Angle)
{
    PWM_SetCompare4(Angle / 180*2000 +500);
}

Servo.h如下:

#ifndef __SERVO_H
#define __SERVO_H

void Servo_Init(void);
void Servo_SetAngle(float Angle);

#endif

main函数如下

#include "stm32f10x.h"   // Device header
#include "Delay.h"
#include "OLED.h"
#include "Servo.h"
#include "Key.h"

uint8_t KeyNum;
float Angle;

int main(void)
{
    OLED_Init();
    Servo_Init();
    Key_Init ();
    
    OLED_ShowString (1,1,"Angle:");
    Servo_SetAngle(90);
    
    while(1)
    {
//        KeyNum = Key_GetNum ();
//        if(KeyNum == 1)
//        {
//            Angle+=30;
//            if(Angle>=180)
//            {
//                Angle =0;
//            }
//        }
//        for(Angle=0;Angle<=180;)
//        {
//            Servo_SetAngle (Angle);
//            Delay_ms (1000);
//            Angle+=30;
//            if(Angle>180)
//            {
//                Angle =0;
//            }
//            OLED_ShowNum (1,7,Angle ,3);
//        }
        
        
    }
}

代码就是这样的,我是刚学的,然后就到这里不知道了,主文件里只要有双斜杠的就是注释了的,求解答。

  • 写回答

4条回答 默认 最新

  • 码农阿豪 Java领域优质创作者 2024-03-27 21:38
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    根据代码以及问题描述,舵机没有反应可以有以下几个方面考虑和排查:
    1. 是否接线正确:检查舵机的信号线是否接在正确的引脚上,以及是否接地和给电源。
    2. 是否电源电压不足:如果电池电量不足或者供电电压较低,可能会导致舵机无法正常工作。
    3. 舵机的角度值是否正确:在使用PWM控制舵机时,需要按照舵机的规格来设置角度值对应的PWM信号占空比,如果设置错误,则会导致舵机在工作中不响应。
    4. PWM控制的参数是否正确:检查PWM的控制参数设置是否正确,比如ARR和PSC。
    5. 是否其他硬件问题:如芯片损坏等原因也可能导致舵机不响应。 案例:以舵机角度值设置不正确导致舵机无法响应为例,可以通过增加调试信息的方式来排查:
    6. 修改Servo.c文件中的Servo_SetAngle函数,增加调试信息: void Servo_SetAngle(float Angle){ uint16_t Compare = Angle / 180 * 2000 + 500; printf("Compare value: %d\r\n", Compare); PWM_SetCompare4(Compare); }
    7. 在main函数中增加串口初始化代码,并添加串口接收中断来打印调试信息: #include "stm32f10x.h" #include "Delay.h" #include "OLED.h" #include "Servo.h" #include "Key.h" #include "stdio.h" void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { char data = USART_ReceiveData(USART1); USART_SendData(USART1, data); while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); } } int main(void) { OLED_Init(); Servo_Init(); Key_Init ();

      // 串口初始化 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART1, &USART_InitStructure); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); USART_Cmd(USART1, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_Init(&NVIC_InitStructure); OLED_ShowString (1,1,"Angle:"); Servo_SetAngle(90); while(1) { // KeyNum = Key_GetNum (); // if(KeyNum == 1) // { // Angle+=30; // if(Angle>=180) // { // Angle = 0; // } // } for(Angle=0;Angle<=180;) { Servo_SetAngle (Angle); Delay_ms (1000); Angle+=30; if(Angle>180) { Angle = 0; } OLED_ShowNum (1,7,Angle ,3); } } }

    8. 连接电脑串口,打开串口调试软件,观察控制台输出的信息,查看比较值是否符合舵机规格和要求。
    9. 如果比较值不正确,则需要检查角度值的输入和转换算法是否正确,并按照舵机规格设置占空比调整Compare值。如果比较值正确,则需要排查其他可能的硬件问题。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月4日
  • 已采纳回答 3月27日
  • 创建了问题 3月27日

悬赏问题

  • ¥15 本人本科机械,目前研一。没有深度学习基础,目前对研究生课题一片迷茫,请教各位!
  • ¥15 关于R语言单因素与多因素线性回归的平均值
  • ¥15 服务器清除BIOS之后引导不了
  • ¥15 CPLEX用OPL编写的混合整数线性优化问题。
  • ¥15 可以用EasyConnect连接实验室内网,但无法连接内网才能访问的服务器,为什么?
  • ¥15 前端预览docx文件,文件从后端传送过来。
  • ¥15 层次聚类和蛋白质相似度
  • ¥25 主成分分析中的第一第二主成分分别代表哪些参数
  • ¥15 oracle数据库查询语句问题
  • ¥15 有没有c++绘制算法的佬们吗救孩一下