这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » Let'sdo2025年第4期-基于单片机的直流电机控制【成果帖】

共1条 1/1 1 跳转至

Let'sdo2025年第4期-基于单片机的直流电机控制【成果帖】

助工
2026-03-02 20:56:01     打赏

一,设计框图

电机控制的逻辑框图如下。

image.png

二,配置

1. 引脚使用
速度正转反转
p3.6p1.5p1.6


调速调方向
p1.7p3.29
2. config配置

配置p3.6连接到flexpwm0 a 外设,用与输入pwm波形,控制驱动板的速度调节

按钮sw2 和sw3 用于控制电机的转速和 方向

image.png

image.png

三,代码

开启b两个btn的中断。

image.png

配置方向的引脚,为输出模式。

image.png

配置引脚p3.6为pwm模式。

image.png


按钮中断

 /* GPIO1_IRQn interrupt handler */
void GPIO1_IRQHandler(void) {
    GPIO_GpioClearInterruptFlags(GPIO1, 1U << 7);
  /*  Place your code here */
  /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F
     Store immediate overlapping exception return operation might vector to incorrect interrupt. */
  #if defined __CORTEX_M && (__CORTEX_M == 4U)
    __DSB();
  #endif
    PRINTF("gpio1_Handler rn");

    GPIO_PortToggle(GPIO1, 1U << 5);
    GPIO_PortToggle(GPIO1, 1U << 6);
}
/* GPIO3_IRQn interrupt handler */
uint32_t pwmVal = 1;
void GPIO3_IRQHandler(void) {
    GPIO_GpioClearInterruptFlags(GPIO3, 1U << 29);
  /*  Place your code here */
  /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F
     Store immediate overlapping exception return operation might vector to incorrect interrupt. */
    pwmVal = pwmVal + 1;
    PRINTF("gpio3_Handler pwmVal[%d]rn",pwmVal);
    PWM_UpdatePwmDutycycle(FLEXPWM0, kPWM_Module_0, kPWM_PwmA, kPWM_SignedCenterAligned, pwmVal);
    PWM_SetPwmLdok(FLEXPWM0, kPWM_Control_Module_0 | kPWM_Control_Module_1 | kPWM_Control_Module_2, true);
}

pwm 配置代码

void initpwmf()
{
    pwm_config_t pwmConfig;
    pwm_fault_param_t faultConfig;
    PWM_GetDefaultConfig(&pwmConfig);
    pwmConfig.prescale = DEMO_PWM_CLOCK_DEVIDER;

    /* Use full cycle reload */
    pwmConfig.reloadLogic = kPWM_ReloadPwmFullCycle;
    /* PWM A & PWM B form a complementary PWM pair */
    pwmConfig.pairOperation   = kPWM_Independent;
    pwmConfig.enableDebugMode = true;
    PWM_Init(BOARD_PWM_BASEADDR, kPWM_Module_0, &pwmConfig);

    PWM_FaultDefaultConfig(&faultConfig);

#ifdef DEMO_PWM_FAULT_LEVEL
    faultConfig.faultLevel = DEMO_PWM_FAULT_LEVEL;
#endif
    /* Sets up the PWM fault protection */
    PWM_SetupFaults(BOARD_PWM_BASEADDR, kPWM_Fault_0, &faultConfig);
    PWM_SetupFaults(BOARD_PWM_BASEADDR, kPWM_Fault_1, &faultConfig);
    PWM_SetupFaults(BOARD_PWM_BASEADDR, kPWM_Fault_2, &faultConfig);
    PWM_SetupFaults(BOARD_PWM_BASEADDR, kPWM_Fault_3, &faultConfig);

   
    PWM_DRV_Init3PhPwm();

    PWM_SetPwmLdok(BOARD_PWM_BASEADDR, kPWM_Control_Module_0 | kPWM_Control_Module_1 | kPWM_Control_Module_2, true);

    /* Start the PWM generation from Submodules 0, 1 and 2 */
    PWM_StartTimer(BOARD_PWM_BASEADDR, kPWM_Control_Module_0 | kPWM_Control_Module_1 | kPWM_Control_Module_2);

}


四,棘手问题

测试过程中,发现io电压不对,只有2.4v,导致无法通过引脚控制驱动板子的方向

image.png

把j2短接一下,电压就够了。


效果:










关键词: ncsa155     pwm     空心杯    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]