Libs for using Nucleo STM32F411 periphery

Introduction

Descruption: This lib uses the hardware peripherie from STM32F411 under serveral conditions. So you can use an quadraturencoder with different timers.

Requirement: Only tested with the nucleo F411. Include the mbed lib! Interfacing details are explained in the documentary of each class.

Overview

  1. timer modules
    1. Quadratur Encoder (Version 1.2 - C. Hoyer 12.8.2015)
  2. SPI modules
    1. AD5664 (Version 1.1 - C. Hoyer 23.7.2015)
  3. software modules
    1. Ringbuffer (Version 0.9 - C. Hoyer 18.8.2015)
    2. PID-Regler (Version 1.0 - C. Hoyer 17.9.2015)
Committer:
ChrisselH
Date:
Mon Nov 28 17:27:43 2016 +0000
Revision:
0:1acdcc576936
port from priv lib

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ChrisselH 0:1acdcc576936 1 #include "mbed.h"
ChrisselH 0:1acdcc576936 2
ChrisselH 0:1acdcc576936 3 #ifndef AD5664_h
ChrisselH 0:1acdcc576936 4 #define AD5664_h
ChrisselH 0:1acdcc576936 5
ChrisselH 0:1acdcc576936 6 /*! Diese Klasse dient zur Ansteuerung des Digital-Analog-Wandlers AD5664 der Firma Analog Devices. Der DAC ist ein 16-Bit Wandler mit 4 Kanälen, Versorgungsspannung von 2,7V bis 5,5V.
ChrisselH 0:1acdcc576936 7 Die Maximale Settling Time beträgt 7µs (AD5664), und die Genauigkeit liegt bei +-12 LSBs maximum. Angesteuert wird er mittels SCLK, CS und MOSI mit maximal 50 MHz. Zuvor muss die SPI-Schnittstelle definiert werden. Die
ChrisselH 0:1acdcc576936 8 Chip Select Schnittstelle kann durch die Initialisierung mit Übergeben werden. Es ist darauf zu achten das der Chip bzw die Library nur den SPI-Modus "1" (CLK Standart auf 0 und übernahme mit fallender Flanke) mit einer Datenbreite von 8-Bit unterstützt.
ChrisselH 0:1acdcc576936 9
ChrisselH 0:1acdcc576936 10 * @code
ChrisselH 0:1acdcc576936 11 * #include "mbed.h"
ChrisselH 0:1acdcc576936 12 * #include "AD5664.h"
ChrisselH 0:1acdcc576936 13 *
ChrisselH 0:1acdcc576936 14 * SPI interface(PB_5, PB_4, PB_3); // SPI Interface und Pins (MISO PB.5 , MOSI PB.4, SCLK PB.3) festlegen
ChrisselH 0:1acdcc576936 15 *
ChrisselH 0:1acdcc576936 16 * int main() {
ChrisselH 0:1acdcc576936 17 *
ChrisselH 0:1acdcc576936 18 * interface.format(8,1); // Interface Format festlegen: 8-Bit, SPI-Modus 1
ChrisselH 0:1acdcc576936 19 * interface.frequency(1000000); // Übertragungsgeschwindigkeit 1MHz
ChrisselH 0:1acdcc576936 20 *
ChrisselH 0:1acdcc576936 21 * AD5664 device(interface, PB_2); // Eine Instanz des DACs erzeugen, Chipselect ist PB.2
ChrisselH 0:1acdcc576936 22 *
ChrisselH 0:1acdcc576936 23 * device.loadDAC('D', 0x11FF); // Den Wert 0x11FF in den Kanal D laden
ChrisselH 0:1acdcc576936 24 *
ChrisselH 0:1acdcc576936 25 * device.updateDAC('D'); // Den geladenen Wert am Kanal D ausgeben
ChrisselH 0:1acdcc576936 26 *
ChrisselH 0:1acdcc576936 27 * device.writeDAC('A', 0x89BD); // Den Wert 0x89BD an dem Kanal A direkt ausgeben
ChrisselH 0:1acdcc576936 28 *
ChrisselH 0:1acdcc576936 29 * }
ChrisselH 0:1acdcc576936 30 *
ChrisselH 0:1acdcc576936 31 * @endcode
ChrisselH 0:1acdcc576936 32 */
ChrisselH 0:1acdcc576936 33
ChrisselH 0:1acdcc576936 34 class AD5664
ChrisselH 0:1acdcc576936 35 {
ChrisselH 0:1acdcc576936 36 public:
ChrisselH 0:1acdcc576936 37
ChrisselH 0:1acdcc576936 38 /*! Konstruktor zum Erstellen einer Instanz für einen vorher spezifizierten SPI-Port und Chip Select-Pin. Nach dem Erstellen dieser Instanz werden alle Ausgänge des DACs auf 0 gesetzt. */
ChrisselH 0:1acdcc576936 39 /*!
ChrisselH 0:1acdcc576936 40 \param spi Entsprechner SPI-Port (Datenbreite 8 Bit, SPI Modus 1)
ChrisselH 0:1acdcc576936 41 \param daccs Pin für Chipselect
ChrisselH 0:1acdcc576936 42 */
ChrisselH 0:1acdcc576936 43 AD5664(SPI _spi, PinName _daccs);
ChrisselH 0:1acdcc576936 44
ChrisselH 0:1acdcc576936 45
ChrisselH 0:1acdcc576936 46
ChrisselH 0:1acdcc576936 47 /*! Funktion zum Beschreiben des Chips mit je 8-Bit. Für genauere Details bitte das Datenblatt lesen*/
ChrisselH 0:1acdcc576936 48 /*!
ChrisselH 0:1acdcc576936 49 \param instruction <b>Direkte Anweisungen für den AD5664</b><br>
ChrisselH 0:1acdcc576936 50 Die 8 Instruction-Bits sind wie folgt aufgebaut:<br> <br>
ChrisselH 0:1acdcc576936 51 <CENTER> X X C C C A A A </CENTER><br>
ChrisselH 0:1acdcc576936 52 - Die ersten zwei Bits sind don't cares<br>
ChrisselH 0:1acdcc576936 53 - Die <EM>Befehle C</EM> sind wie fogt aufgebaut<br>
ChrisselH 0:1acdcc576936 54 <ul>
ChrisselH 0:1acdcc576936 55 <li> 000 Schreibe Input register N</li>
ChrisselH 0:1acdcc576936 56 <li> 001 Update DAC Register N</li>
ChrisselH 0:1acdcc576936 57 <li> 010 Schreibe Inputregister N und Update alle DAC Register</li>
ChrisselH 0:1acdcc576936 58 <li> 011 Schreibe Inputregister N und Update DAC Register N</li>
ChrisselH 0:1acdcc576936 59 <li> 100 Power Down DAC (siehe Datenblatt)</li>
ChrisselH 0:1acdcc576936 60 <li> 101 Reset (siehe Datenblatt)</li>
ChrisselH 0:1acdcc576936 61 <li> 110 Funktionsregister LDAC (siehe Datenblatt)</li>
ChrisselH 0:1acdcc576936 62 </ul>
ChrisselH 0:1acdcc576936 63 - Die <EM>Adresse A</EM> zum Register N sind wie fogt aufgebaut<br>
ChrisselH 0:1acdcc576936 64 <ul>
ChrisselH 0:1acdcc576936 65 <li> 000 DAC A</li>
ChrisselH 0:1acdcc576936 66 <li> 001 DAC B</li>
ChrisselH 0:1acdcc576936 67 <li> 010 DAC C</li>
ChrisselH 0:1acdcc576936 68 <li> 011 DAC B</li>
ChrisselH 0:1acdcc576936 69 <li> 111 All DACs</li>
ChrisselH 0:1acdcc576936 70 </ul>
ChrisselH 0:1acdcc576936 71
ChrisselH 0:1acdcc576936 72 \param data1 <b>Datenbits</b><br>
ChrisselH 0:1acdcc576936 73 ersten 8 Datenbits, bzw. oberen zwei Nibble
ChrisselH 0:1acdcc576936 74 \param data2 <b>Datenbits</b><br>
ChrisselH 0:1acdcc576936 75 zweiten 8 Datenbits, bzw. unteren zwei Nibble
ChrisselH 0:1acdcc576936 76 */
ChrisselH 0:1acdcc576936 77 void sendDAC(int instruction, int data1, int data2);
ChrisselH 0:1acdcc576936 78
ChrisselH 0:1acdcc576936 79 /*! Destruktor der Klasse */
ChrisselH 0:1acdcc576936 80 virtual ~AD5664(){};
ChrisselH 0:1acdcc576936 81
ChrisselH 0:1acdcc576936 82 /*! Setzt den Chipselect-Pin des Wandlers auf "select" bzw. wählt diesen aus. */
ChrisselH 0:1acdcc576936 83 void SelectCS();
ChrisselH 0:1acdcc576936 84
ChrisselH 0:1acdcc576936 85 /*! Setzt den Chipselect-Pin des Wandlers auf "deselect" bzw. wählt diesen ab. */
ChrisselH 0:1acdcc576936 86 void DeselectCS();
ChrisselH 0:1acdcc576936 87
ChrisselH 0:1acdcc576936 88
ChrisselH 0:1acdcc576936 89
ChrisselH 0:1acdcc576936 90 /*! Schreibt ein 16-Bit Wert in den eingestellten Kanal. Der Wert wird direkt in das DAC Register geschrieben und der Wert wird direkt ausgegen. */
ChrisselH 0:1acdcc576936 91 /*!
ChrisselH 0:1acdcc576936 92 \param channel <b>Einstellung des Ausgewählten Kanals</b><br>
ChrisselH 0:1acdcc576936 93 <ul>
ChrisselH 0:1acdcc576936 94 <li> A Beschreibt Kanal A</li>
ChrisselH 0:1acdcc576936 95 <li> B Beschreibt Kanal B</li>
ChrisselH 0:1acdcc576936 96 <li> C Beschreibt Kanal C</li>
ChrisselH 0:1acdcc576936 97 <li> D Beschreibt Kanal D</li>
ChrisselH 0:1acdcc576936 98 <li> F Beschreibt alle DACs </li>
ChrisselH 0:1acdcc576936 99 </ul>
ChrisselH 0:1acdcc576936 100 Standartwert, falls ein falscher Kanal angegeben wird ist "F"
ChrisselH 0:1acdcc576936 101 \param value <b>16-Bit Wert</b><br> Wird Automatisch in zwei 8 Bit Werte angepasst.
ChrisselH 0:1acdcc576936 102 */
ChrisselH 0:1acdcc576936 103 void writeDAC(char channel, int value);
ChrisselH 0:1acdcc576936 104
ChrisselH 0:1acdcc576936 105
ChrisselH 0:1acdcc576936 106
ChrisselH 0:1acdcc576936 107 /*! Lädt ein 16-Bit Wert in den eingestellten Kanal. Der Wert wird direkt in das Inputregister geschrieben und kann mit der updateDAC-Funktion in das DAC-Register geschrieben werden */
ChrisselH 0:1acdcc576936 108 /*!
ChrisselH 0:1acdcc576936 109 \param channel <b>Einstellung des Ausgewählten Kanals</b><br>
ChrisselH 0:1acdcc576936 110 <ul>
ChrisselH 0:1acdcc576936 111 <li> A Lädt Kanal A</li>
ChrisselH 0:1acdcc576936 112 <li> B Lädt Kanal B</li>
ChrisselH 0:1acdcc576936 113 <li> C Lädt Kanal C</li>
ChrisselH 0:1acdcc576936 114 <li> D Lädt Kanal D</li>
ChrisselH 0:1acdcc576936 115 <li> F Lädt alle DACs </li>
ChrisselH 0:1acdcc576936 116 </ul>
ChrisselH 0:1acdcc576936 117 Standartwert, falls ein falscher Kanal angegeben wird ist "F"
ChrisselH 0:1acdcc576936 118 \param value <b>16-Bit Wert</b><br> Wird Automatisch in zwei 8 Bit Werte angepasst.
ChrisselH 0:1acdcc576936 119 */
ChrisselH 0:1acdcc576936 120 void loadDAC(char channel, int value);
ChrisselH 0:1acdcc576936 121
ChrisselH 0:1acdcc576936 122
ChrisselH 0:1acdcc576936 123 /*! Schreibt zuvor eingestellten Wert in das DAC Register (Laden mittels loadDAC-Funktion). Dieser Wert ist dann am Ausgang des entsprechenden DAC-Kanals zu messen. */
ChrisselH 0:1acdcc576936 124 /*!
ChrisselH 0:1acdcc576936 125 \param channel <b>Einstellung des Ausgewählten Kanals</b><br>
ChrisselH 0:1acdcc576936 126 <ul>
ChrisselH 0:1acdcc576936 127 <li> A Beschreibt Kanal A</li>
ChrisselH 0:1acdcc576936 128 <li> B Beschreibt Kanal B</li>
ChrisselH 0:1acdcc576936 129 <li> C Beschreibt Kanal C</li>
ChrisselH 0:1acdcc576936 130 <li> D Beschreibt Kanal D</li>
ChrisselH 0:1acdcc576936 131 <li> F Beschreibt alle DACs </li>
ChrisselH 0:1acdcc576936 132 </ul>
ChrisselH 0:1acdcc576936 133 Standartwert, falls ein falscher Kanal angegeben wird ist "F"
ChrisselH 0:1acdcc576936 134 */
ChrisselH 0:1acdcc576936 135 void updateDAC(char channel);
ChrisselH 0:1acdcc576936 136
ChrisselH 0:1acdcc576936 137 protected:
ChrisselH 0:1acdcc576936 138 //! SPI Schnittstelle
ChrisselH 0:1acdcc576936 139 SPI spi;
ChrisselH 0:1acdcc576936 140 //! Chipselect Pin
ChrisselH 0:1acdcc576936 141 DigitalOut daccs;
ChrisselH 0:1acdcc576936 142
ChrisselH 0:1acdcc576936 143 };
ChrisselH 0:1acdcc576936 144
ChrisselH 0:1acdcc576936 145 #endif