MC33970DW

Koldune
Offline
Зарегистрирован: 07.04.2011

Пытаюсь прикрутить данный девайс к Arduino NG (делаю стрелочный тахометр). Но почему-то никак не выходит, не хочет стрелка на шаговике двигаться, какие бы команды я не подавал. С SPI я до этого вообще не работал, поэтому не понимаю, в чём моя ошибка. Помогите советом, что я не так делаю?

 

#include <SPI.h>

const int chipSelectPin = 10;

void setup() {
  
 

  pinMode(chipSelectPin, OUTPUT);
  SPI.begin();
  SPI.setDataMode(SPI_MODE1);
  SPI.setClockDivider(SPI_CLOCK_DIV16);
  SPI.setBitOrder(MSBFIRST);
  

}

void loop() {
  
  

  
  SPI.transfer(0b00000000);
  SPI.transfer(0b00000011);
  SPI.transfer(0b00100000);
  SPI.transfer(0b00000001);
  SPI.transfer(0b10000000);
  SPI.transfer(0b00000000);
  SPI.transfer(0b01001111);
  SPI.transfer(0b11111111);
  SPI.transfer(0b01101111);
  SPI.transfer(0b11111111);
 
  delay(1000); 
}

 

icms
Offline
Зарегистрирован: 22.03.2011

 Схемку подключения MC33970DW к арде можно глянуть? Немного на пальцах что и как должно работать? И чтобы было более прозрачно и не пришлось изучать даташиты па этой микрухе )) можно подписать, сделать коменты, т.е. отсылаем команду и что должно произойти. Дело в том что если все команды вида SPI.transfer(0b01001111); это установка навого положения двигателя, то подозреваю что если что то и будет происходить то максиму увидим последнее значение arduino то команды отсылает гораздо быстрее че это может обработать двигатель и думаю скоросто обмена по spi тут нипричём.

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

на сколько я понял это драйвер стрелочных индикаторов, а не моторов. На выходе у него косинус и синус сигнал смещая эти сигналы получаем вращение на 360' максимум для стрелочника 340' думаю у вас проблема именно в том что вы используете мотор а не стрелочник. То.е. на выходе вы получате две фазы относительно друг друга на 90'. Прелесть такого драйвера заключена в том что вы получаете наиболее стабильные показания без инерционных вибраций. К тому же подавая цифровой сигнал получаете на выходе аналоговый.

 

Я тут тоже собираю информацию по изготовлению тахометра, для авто. но я решил делать цифровой с линейной и численной индикацией. 

Koldune
Offline
Зарегистрирован: 07.04.2011

В том-то и дело, что вся связка - MC33970DW и два шаговика VID29-03P были выпаяны из газелевской приборной панели, где отлично работали, схему подключения скопировал оттуда. Да и в datasheet написано, что эта микросхема - Н-мостовой драйвер биполярных шаговых индикаторов.

 

Подключил я её как написано в SPI библиотеке: 10 - SCLK, 11 - MOSI, 12 - MISO, 13 - CS. Вывод Reset пробовал и в воздухе оставлять, и подключать к резету Atmega - разницы никакой.

Просто дело в том, что адреса регистров у этого контроллера находятся в байтах D15:D13, т.е. в первом старшем байте мы посылаем и адрес регистра, и часть данных. Мне вот это не нравится, но как по-другому, я не знаю.

#include <SPI.h>

const int chipSelectPin = 10;

void setup() {
  
 

  pinMode(chipSelectPin, OUTPUT);
  SPI.begin();
  SPI.setDataMode(SPI_MODE1);
  SPI.setClockDivider(SPI_CLOCK_DIV16);
  SPI.setBitOrder(MSBFIRST);
  

}

void loop() {
  
  

  
  SPI.transfer(0b00000000); // настраиваем регистр конфигурации
  SPI.transfer(0b00000011); //
  
  delay(1000);
  
  SPI.transfer(0b00100000); // настраиваем регистр скорости стрелки
  SPI.transfer(0b00000001); //
  
  delay(1000);
  
  SPI.transfer(0b10000000); // настраиваем регистр возврата в ноль
  SPI.transfer(0b00000000); //
  
  delay(1000);
  
  SPI.transfer(0b01001111); // положение прибора 0 - на максимум
  SPI.transfer(0b11111111);
  
  delay(1000);
  
  SPI.transfer(0b01101111); // положение прибора 1 - на максимум
  SPI.transfer(0b11111111); //
 
  delay(1000); 
}

 

 

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

Ну тогда да проблема наврядли в железе. Надо тоже библиотеку поковырять 

icms
Offline
Зарегистрирован: 22.03.2011

Вот посмотри вот это, насколько я понял у тебя мега 

On the Arduino Duemilanove and other ATmega168 / 328-based boards, the SPI bus uses pins 10 (SS), 11 (MOSI), 12 (MISO), and 13 (SCK). On the Arduino Mega, this is 50 (MISO), 51 (MOSI), 52 (SCK), and 53 (SS). Note that even if you're not using the SS pin, it must remain set as an output; otherwise, the SPI interface can be put into slave mode, rendering the library inoperative.

Для разных arduino разные контакты подключения. 

 

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

Да нет у него не мега а NG. SS на 10 ноге. 

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

Подключил я её как написано в SPI библиотеке: 10 - SCLK, 11 - MOSI, 12 - MISO, 13 - CS. Вывод Reset пробовал и в воздухе оставлять, и подключать к резету Atmega - разницы никакой.

Что то тут не так. смтри 10 выввод это SS - вход на ведомых устройствах с помощью которого ведущий может инициировать обмен данными с периферийным устройством. Он может не использоваться. но должен быть прописан как вывод, у тебя это сделано.
так вот тебе надо подконектить таким образом арду к микре

дальше первое число ардуино второе микруха:

11 к 12,
12 к 11,
13 к 10,

вот так попробуй. Если тока я не напутал с MISO MOSI, но в любом случае 13 ножка арды должна идти к 10 на микре. Если я напутал с MISO MOSI то поменяй местами.

А вот ss вывод ардуины должен кажется идти к 9

Koldune
Offline
Зарегистрирован: 07.04.2011

Конечно же я неправильно написал, CS у меня на 10 ноге висел, а SCLK на 13. А вот MISO и MOSI я перепутал, забыл, что они крест-накрест идут. Правда, ни к чему это не привело