无法使用带有 ATmega16 的 L6234 运行 BLDC 电机



我想在 Atmega 16 控制器的帮助下使用 L6234 驱动器 IC 驱动 BlDC 电机。驱动电机的逻辑在第9页的电机驱动器IC L6234数据表中给出。这是数据表的链接。因此,根据数据表,我编写了一个代码来驱动我的电机。这是我的代码:-

#define F_CPU 8000000UL
#include<avr/io.h>
#include<avr/interrupt.h>
#include<util/delay.h>
#define hall1 (PINC & 1<<1)  // connect hall sensor1
#define hall2 (PINC & 1<<2)  //connect hall sensor2
#define hall3 (PINC & 1<<3)  //connect hall sensor3

void main()
{
    DDRC=0XF0;
    DDRB=0XFF; //output as In1=PB.0 ,In2=PB.1, In3=PB.2, En0=PB.3 ,En1=PB.4, En3=PB.5
    while(1)
    {
        if((hall3==4)&(hall2==0)&(hall1==1)) // step1
          {
             PORTB=0X19;
          }
        if((hall3==0)&(hall2==0)&(hall1==1)) // step2
          {
             PORTB=0X29;
          }
        if((hall3==0)&(hall2==2)&(hall1==1)) // step3
          {
             PORTB=0X33;
          }
        if((hall3==0)&(hall2==2)&(hall1==0)) // step4
          {
             PORTB=0X1E;
          }
        if((hall3==4)&(hall2==2)&(hall1==0))// step5
          {
             PORTB=0X2E;
          }
        if((hall3==4)&(hall2==0)&(hall1==0))// step6
          {
             PORTB=0X34;
          }
    }
}

但是当我运行此代码时,我的电机不工作。所以,谁能告诉我,我的代码中的错误在哪里。

代码的格式使其很难调试。由于您已经在使用宏,我可以提出一些建议以使其更易于阅读吗?

您有 #define hall3 (PINC & 1<<3) ,但此值需要为 4 或 0。为什么不直接将其用作布尔值?

    if(hall3 && etc) // note the double &&

马上,这将修复一个错误。 1<<3 8不是4,所以没有一个if语句会成功,因为代码是当前编写的。(例如,1 是 1<<0,而不是 1<<1。

PORTB 硬编码输出也很难破译。我建议使用 #defines 也使这更容易。

#define EN1 3
#define EN2 4
#define EN3 5
#define IN1 0
#define IN2 1
#define IN3 2
...
    PORTB = 1<<EN1 | 1<<EN2 | 1<<IN1; // step 1

旧的/废弃的问题,但只是看看这个:

#define hall1 (PINC & 1<<1)  // connect hall sensor1

让我差点哭...因为它完全是!!

首先,宏中不能有//注释,这会弄乱您的代码,因为它也会复制到您的代码中,无论您在哪里使用hall1

第二个GC/GCC真的很愚蠢,所以你必须正确括号你的东西尝试:

#define hall1 (PINC & (1<<1))

我也看到你的复合表达式也是错误的:

if((hall3==4)&(hall2==0)&(hall1==1))

应该是:

if ((hall3==4)&&(hall2==0)&&(hall1==1))

甚至更好:

if ((hall3)&&(!hall2)&&(hall1))

相关内容

  • 没有找到相关文章

最新更新