路过的金鱼 2024-03-08 21:30 采纳率: 100%
浏览 34
已结题

请问stm32单片机驱动ir2104sH桥测试函数

请问这个怎么写pwm波,基于32f407ze单片机直流电机控制(IR2104S驱动H桥)

img

img

img


选毕设的时候,本来感觉不难,但是连电机动没转起来,本人基本代码全靠copy,换过好几个代码了,就是没一点动静
我干脆只搞了个主函数,只试一个电机,也动不起来。


#include "stm32f4xx.h"                   // Device header
#include "main.h" 
void ledrun(void);
void TIM1_PWM_Init() ;
int main(void)

{
    TIM1_PWM_Init();
    ledrun();
    
}


void TIM1_PWM_Init(uint16_t period, uint16_t prescaler) {  
    // 开启TIM1时钟  
      TIM_OCInitTypeDef TIM_OCInitStructure;  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);  
  
    // 初始化TIM1  
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
    TIM_TimeBaseStructure.TIM_Period = period;        // 设置周期  
    TIM_TimeBaseStructure.TIM_Prescaler = prescaler;  // 设置预分频值  
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;      // 时钟分频因子  
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  // 向上计数模式  
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);  
  
    // 初始化TIM1的CH1和CH2N为PWM模式  
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;  // PWM模式1  
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  // 使能输出  
    TIM_OCInitStructure.TIM_Pulse = period / 2;  // 设置脉冲宽度,这里设置为50%占空比  
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  // 输出极性为高  
  
    // 配置TIM1的CH1  
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);  
    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  // 使能预装载寄存器  
  
    // 配置TIM1的CH2N(需要额外配置为互补输出)  
    TIM_OC2Init(TIM1, &TIM_OCInitStructure);  // 先按常规初始化CH2  
    TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);  // 使能预装载寄存器  
  
    TIM_BDTRInitTypeDef TIM_BDTRInitStructure;  
    TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;  // 使能运行时的输出  
    TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;  // 使能空闲时的输出  
    TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;  // 没有锁定  
    TIM_BDTRInitStructure.TIM_DeadTime = 0;  // 无死区时间  
    TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;  // 禁用刹车功能  
    TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;  // 刹车极性为低  
    TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;  // 禁用自动输出  
  
    // 设置CH2为互补输出并映射到对应的引脚(PE10)  
    TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);  
    TIM_OC2NPolarityConfig(TIM1, TIM_OCNPolarity_High);  // 设置CH2N的输出极性为高  
  
    // 使能TIM1的CH1和CH2N输出  
    TIM_CtrlPWMOutputs(TIM1, ENABLE);  
  
    // 开启TIM1  
    TIM_Cmd(TIM1, ENABLE);  
}  
  
void ledrun(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;  
  
    // 开启GPIOB的时钟  
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);  
  
    // 配置PB12为输出模式  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;  
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 更正为输出模式  
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 选择一个适当的速度  
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 推挽输出  
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOB, &GPIO_InitStructure); 
     GPIO_ResetBits(GPIOB, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  
}    



就希望搞个函数给我,让电机转起来先,或者告诉我是不是我对原理图理解有问题怎么让电机转起来,坐两天了,不知道问题在哪,
想用mdk5的仿真器检查波形也看不了,太难熬了。唯一的进展是点了四个灯,我是点灯大师

  • 写回答

17条回答 默认 最新

  • 蓝天居士 《人工智能从入门到进阶实战》作者 2024-03-09 08:03
    关注

    看一下野火电机开发板配套视频。PWM一章

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(16条)

报告相同问题?

问题事件

  • 系统已结题 3月19日
  • 已采纳回答 3月11日
  • 修改了问题 3月8日
  • 创建了问题 3月8日