Embedded Digital Control with Microcontrollers

Implementation with C and Python
Standards Information Network (Verlag)
  • 1. Auflage
  • |
  • erschienen am 29. März 2021
  • |
  • 368 Seiten
E-Book | ePUB mit Adobe-DRM | Systemvoraussetzungen
978-1-119-57655-6 (ISBN)

Explore a concise and practical introduction to implementation methods and the theory of digital control systems on microcontrollers

Embedded Digital Control with Microcontrollers delivers expert instruction in digital control system implementation techniques on the widely used ARM Cortex-M microcontroller. The accomplished authors present the included information in three phases. First, they describe how to implement prototype digital control systems via the Python programming language in order to help the reader better understand theoretical digital control concepts.

Second, the book offers readers direction on using the C programming language to implement digital control systems on actual microcontrollers. This will allow readers to solve real-life problems involving digital control, robotics, and mechatronics.

Finally, readers will learn how to merge the theoretical and practical issues discussed in the book by implementing digital control systems in real-life applications. Throughout the book, the application of digital control systems using the Python programming language ensures the reader can apply the theory contained within. Readers will also benefit from the inclusion of:

A thorough introduction to the hardware used in the book, including STM32 Nucleo Development Boards and motor drive expansion boards
An exploration of the software used in the book, including Python, MicroPython, and Mbed
Practical discussions of digital control basics, including discrete-time signals, discrete-time systems, linear and time-invariant systems, and constant coefficient difference equations
An examination of how to represent a continuous-time system in digital form, including analog-to-digital conversion and digital-to-analog conversion

Perfect for undergraduate students in electrical engineering, Embedded Digital Control with Microcontrollers will also earn a place in the libraries of professional engineers and hobbyists working on digital control and robotics systems seeking a one-stop reference for digital control systems on microcontrollers.
1. Auflage
  • Englisch
  • USA
John Wiley & Sons Inc
  • Für Beruf und Forschung
  • 25,73 MB
978-1-119-57655-6 (9781119576556)

weitere Ausgaben werden ermittelt
Cem UEnsalan, PhD, has over 20 years of experience working on signal processing and embedded systems. He received his doctorate from Ohio State University in 2003. He has published 23 papers in scientific journals and eight international books.

Duygun E. Barkana, PhD, has over 16 years of experience working on control and robotic systems. She received her doctorate from Vanderbilt University in 2007. She has published 22 papers in scientific journals and six international book chapters.

H. Deniz Gurhan is pursuing a PhD at Yeditepe University, where he received his BSc degree. He has over six years of experience working with guided microprocessors and digital signal processing.
Preface xvii

About the Companion Website xix

1 Introduction 1

1.1 What is a System? 1

1.2 What is a Control System? 1

1.3 About the Book 3

2 Hardware to be Used in the Book 5

2.1 The STM32 Board 5

2.1.1 General Information 6

2.1.2 Pin Layout 6

2.1.3 Powering and Programming the Board 8

2.2 The STM32 Microcontroller 8

2.2.1 Central Processing Unit 8

2.2.2 Memory 9

2.2.3 Input and Output Ports 10

2.2.4 Timer Modules 10

2.2.5 ADC and DAC Modules 11

2.2.6 Digital Communication Modules 11

2.3 System and Sensors to be Used Throughout the Book 12

2.3.1 The DC Motor 12 Properties of the DC Motor 12 Pin Layout 13 Power Settings 14

2.3.2 The DC Motor Drive Expansion Board 14

2.3.3 Encoder 15

2.3.4 The FT232 Module 17

2.4 Systems and Sensors to be Used in Advanced Applications 17

2.4.1 Systems 17

2.4.2 Sensors 19

2.5 Summary 19

Problems 20

3 Software to be Used in the Book 23

3.1 Python on PC 24

3.1.1 Basic Operations 24

3.1.2 Array and Matrix Operations 25

3.1.3 Loop Operations 26

3.1.4 Conditional Statements 27

3.1.5 Function Definition and Usage 27

3.1.6 File Operations 28

3.1.7 Python Control Systems Library 28

3.2 MicroPython on the STM32 Microcontroller 29

3.2.1 Setting up MicroPython 29

3.2.2 Running MicroPython 31

3.2.3 Reaching Microcontroller Hardware 34 Input and Output Ports 34 Timers 35 ADC 37 DAC 39 UART 41

3.2.4 MicroPython Control Systems Library 42

3.3 C on the STM32 Microcontroller 43

3.3.1 Creating a New Project in Mbed Studio 44

3.3.2 Building and Executing the Code 45

3.3.3 Reaching Microcontroller Hardware 45 Input and Output Ports 46 Timers 47 ADC 48 DAC 50 UART 51

3.3.4 C Control Systems Library 53

3.4 Application: Running the DC Motor 53

3.4.1 Hardware Setup 54

3.4.2 Procedure 54

3.4.3 C Code for the System 54

3.4.4 Python Code for the System 57

3.4.5 Observing Outputs 59

3.5 Summary 59

Problems 60

4 Fundamentals of Digital Control 63

4.1 Digital Signals 63

4.1.1 Mathematical Definition 64

4.1.2 Representing Digital Signals in Code 64 Representation in Python 65 Representation in C 65

4.1.3 Standard Digital Signals 65 Unit Pulse Signal 66 Step Signal 67 Ramp Signal 68 Parabolic Signal 68 Exponential Signal 69 Sinusoidal Signal 71 Damped Sinusoidal Signal 71 Rectangular Signal 72 Sum of Sinusoids Signal 73 Sweep Signal 75 Random Signal 76

4.2 Digital Systems 77

4.2.1 Mathematical Definition 77

4.2.2 Representing Digital Systems in Code 78 Representation in Python 78 Representation in C 79

4.2.3 Digital System Properties 79 Stability 79 Linearity 80 Time-Invariance 81

4.3 Linear and Time-Invariant Systems 81

4.3.1 Mathematical Definition 81

4.3.2 LTI Systems and Constant-Coefficient Difference Equations 82

4.3.3 Representing LTI Systems in Code 82 MicroPython Control Systems Library Usage 83 C Control Systems Library Usage 84 Python Control Systems Library Usage 85

4.3.4 Connecting LTI Systems 87 Series Connection 87 Parallel Connection 88 Feedback Connection 89

4.4 The z-Transform and Its Inverse 90

4.4.1 Definition of the z-Transform 90

4.4.2 Calculating the z-Transform in Python 92

4.4.3 Definition of the Inverse z-Transform 92

4.4.4 Calculating the Inverse z-Transform in Python 92

4.5 The z-Transform and LTI Systems 93

4.5.1 Associating Difference Equation and Impulse Response of an LTI System 93

4.5.2 Stability Analysis of an LTI System using z-Transform 95

4.5.3 Stability Analysis of an LTI System in Code 95

4.6 Application I: Acquiring Digital Signals from the Microcontroller, Processing Offline Data 96

4.6.1 Hardware Setup 97

4.6.2 Procedure 97

4.6.3 C Code for the System 97

4.6.4 Python Code for the System 99

4.6.5 Observing Outputs 101

4.7 Application II: Acquiring Digital Signals from the Microcontroller, Processing Real-Time Data 103

4.7.1 Hardware Setup 103

4.7.2 Procedure 103

4.7.3 C Code for the System 104

4.7.4 Python Code for the System 106

4.7.5 Observing Outputs 109

4.8 Summary 109

Problems 109

5 Conversion Between Analog and Digital Forms 111

5.1 Converting an Analog Signal to Digital Form 112

5.1.1 Mathematical Derivation of ADC 112

5.1.2 ADC in Code 114

5.2 Converting a Digital Signal to Analog Form 117

5.2.1 Mathematical Derivation of DAC 117

5.2.2 DAC in Code 118

5.3 Representing an Analog System in Digital Form 120

5.3.1 Pole-Zero Matching Method 121

5.3.2 Zero-Order Hold Equivalent 122

5.3.3 Bilinear Transformation 123

5.4 Application: Exciting and Simulating the RC Filter 124

5.4.1 Hardware Setup 125

5.4.2 Procedure 125

5.4.3 C Code for the System 125

5.4.4 Python Code for the System 127

5.4.5 Observing Outputs 129

5.5 Summary 129

Problems 129

6 Constructing Transfer Function of a System 131

6.1 Transfer Function from Mathematical Modeling 131

6.1.1 Fundamental Electrical and Mechanical Components 132

6.1.2 Constructing the Differential Equation Representing the System 133

6.1.3 From Differential Equation to Transfer Function 133

6.2 Transfer Function from System Identification in Time Domain 134

6.2.1 Theoretical Background 135

6.2.2 The Procedure 135

6.2.3 Data Acquisition by the STM32 Microcontroller 136

6.2.4 System Identification in Time Domain by MATLAB 137

6.3 Transfer Function from System Identification in Frequency Domain 142

6.3.1 Theoretical Background 142

6.3.2 The Procedure 142

6.3.3 System Identification in Frequency Domain by MATLAB 143

6.4 Application: Obtaining Transfer Function of the DC Motor 143

6.4.1 Mathematical Modeling 143

6.4.2 System Identification in Time Domain 146

6.4.3 System Identification in Frequency Domain 147

6.5 Summary 148

Problems 148

7 Transfer Function Based Control System Analysis 151

7.1 Analyzing System Performance 151

7.1.1 Time Domain Analysis 151 Transient Response 152 Steady-State Error 156

7.1.2 Frequency Domain Analysis 156

7.1.3 Complex Plane Analysis 159 Root-Locus Plot 160 Nyquist Plot 160

7.2 The Effect of Open-Loop Control on System Performance 163

7.2.1 What is Open-Loop Control? 163

7.2.2 Improving the System Performance by Open-Loop Control 164

7.3 The Effect of Closed-Loop Control on System Performance 167

7.3.1 What is Closed-Loop Control? 167

7.3.2 Improving the System Performance by Closed-Loop Control 170

7.4 Application: Adding Open-Loop Digital Controller to the DC Motor 174

7.4.1 Hardware Setup 175

7.4.2 Procedure 175

7.4.3 C Code for the System 175

7.4.4 Python Code for the System 177

7.4.5 Observing Outputs 178

7.5 Summary 178

Problems 180

8 Transfer Function Based Controller Design 183

8.1 PID Controller Structure 183

8.1.1 The P Controller 184

8.1.2 The PI Controller 184

8.1.3 The PID Controller 185

8.1.4 Parameter Tuning Methods 185 The Ziegler-Nichols Method 186 The Cohen-Coon Method 186 The Chien-Hrones-Reswick Method 186

8.2 PID Controller Design in Python 187

8.2.1 Parameter Tuning 188

8.2.2 Controller Design 188 P Controller 188 PI Controller 191 PID Controller 194

8.2.3 Comparison of the Designed P, PI, and PID Controllers 197

8.3 Lag-Lead Controller Structure 199

8.3.1 Lag Controller 199

8.3.2 Lead Controller 200

8.3.3 Lag-Lead Controller 200

8.4 Lag-Lead Controller Design in MATLAB 201

8.4.1 Control System Designer Tool 201

8.4.2 Controller Design in Complex Plane 203 Lag Controller 204 Lead Controller 206 Lag-Lead Controller 207 Comparison of the Designed Lag, Lead, and Lag-Lead Controllers 210

8.4.3 Controller Design in Frequency Domain 211 Lag Controller 211 Lead Controller 213 Lag-Lead Controller 213 Comparison of the Designed Lag, Lead, and Lag-Lead Controllers 217

8.5 Application: Adding Closed-Loop Digital Controller to the DC Motor 217

8.5.1 Hardware Setup 217

8.5.2 Procedure 217

8.5.3 C Code for the System 218

8.5.4 Python Code for the System 219

8.5.5 Observing Outputs 220

8.6 Summary 223

Problems 224

9 State-space Based Control System Analysis 227

9.1 State-space Approach 227

9.1.1 Definition of the State 227

9.1.2 Why State-space Representation? 228

9.2 State-space Equations Representing an LTI System 228

9.2.1 Continuous-time State-space Equations 229

9.2.2 Discrete-time State-space Equations 231

9.2.3 Representing Discrete-time State-space Equations in Code Form 231

9.3 Conversion Between State-space and Transfer Function Representations 233

9.3.1 From Transfer Function to State-space Equations 233

9.3.2 From State-space Equations to Transfer Function 235

9.4 Properties of the System from its State-space Representation 236

9.4.1 Time Domain Analysis 236

9.4.2 Stability 237

9.4.3 Controllability 238

9.4.4 Observability 239

9.5 Application: Observing States of the DC Motor in Time 240

9.5.1 Hardware Setup 240

9.5.2 Procedure 240

9.5.3 C Code for the System 240

9.5.4 Python Code for the System 242

9.5.5 Observing Outputs 243

9.6 Summary 243

Problems 244

10 State-space Based Controller Design 247

10.1 General Layout 247

10.1.1 Control Based on State Values 248

10.1.2 Regulator Structure 249

10.1.3 Controller Structure 249

10.1.4 What if States Cannot be Measured Directly? 250

10.2 Regulator and Controller Design via Pole Placement 250

10.2.1 Pole Placement 251

10.2.2 Regulator Design 251

10.2.3 Ackermann's Formula for the Regulator Gain 251

10.2.4 Controller Design 252

10.2.5 Ackermann's Formula for the Controller Gain 253

10.3 Regulator and Controller Design in Python 253

10.3.1 Regulator Design 253

10.3.2 Controller Design 256

10.4 State Observer Design 260

10.4.1 Mathematical Derivation 261

10.4.2 Ackermann's Formula for the Observer Gain 262

10.5 Regulator and Controller Design in Python using Observers 263

10.5.1 Observer Design 263

10.5.2 Observer-Based Regulator Design 264

10.5.3 Observer-Based Controller Design 266

10.6 Application: State-space based Control of the DC Motor 270

10.6.1 Hardware Setup 270

10.6.2 Procedure 271

10.6.3 C Code for the System 271

10.6.4 Python Code for the System 273

10.6.5 Observing Outputs 274

10.7 Summary 275

Problems 275

11 Adaptive Control 279

11.1 What is Adaptive Control? 279

11.2 Parameter Estimation 280

11.3 Indirect Self-Tuning Regulator 283

11.3.1 Feedback ISTR Design 283

11.3.2 Feedback and Feedforward ISTR Design 287

11.4 Model-Reference Adaptive Control 288

11.5 Application: Real-Time Parameter Estimation of the DC Motor 290

11.5.1 Hardware Setup 290

11.5.2 Procedure 291

11.5.3 C Code for the System 291

11.5.4 Observing Outputs 293

11.6 Summary 297

Problems 297

12 Advanced Applications 299

12.1 Nonlinear Control 299

12.1.1 Nonlinear System Identification by MATLAB 299

12.1.2 Nonlinear System Input-Output Example 301

12.1.3 Gain Scheduling Example 302

12.1.4 Flat Systems Example 302

12.1.5 Phase Portraits Example 302

12.2 Optimal Control 302

12.2.1 The Linear Quadratic Regulator 303

12.2.2 Continuous-Time LQR Example 304

12.2.3 LQR for the DC Motor 304

12.3 Robust Control 305

12.4 Distributed Control 306

12.4.1 Hardware and Software Setup 306

12.4.2 Procedure 307

12.5 Auto Dimmer 308

12.5.1 Hardware Setup 308

12.5.2 Procedure 309

12.6 Constructing a Servo Motor from DC Motor 309

12.6.1 Hardware Setup 309

12.6.2 Procedure 310

12.7 Visual Servoing 311

12.7.1 Hardware Setup 312

12.7.2 Procedure 312

12.8 Smart Balance Hoverboard 313

12.8.1 Hardware Setup 313

12.8.2 Procedure 314

12.9 Line Following Robot 314

12.9.1 Hardware Setup 314

12.9.2 Procedure 314

12.10 Active Noise Cancellation 315

12.10.1 Hardware Setup 315

12.10.2 Procedure 316

12.11 Sun Tracking Solar Panel 317

12.11.1 Hardware Setup 317

12.11.2 Procedure 317

12.12 System Identification of a Speaker 318

12.12.1 Hardware Setup 319

12.12.2 Procedure 319

12.13 Peltier Based Water Cooler 321

12.13.1 Hardware Setup 321

12.13.2 Procedure 322

12.14 Controlling a Permanent Magnet Synchronous Motor 322

12.14.1 Hardware Setup 322

12.14.2 Procedure 323

Appendix A STM32 Board Pin Usage Tables 329

Bibliography 335

Index 339

Hardware to be Used in the Book

Throughout the book, we will not only introduce digital control concepts from a theoretical perspective, we will also implement them on embedded hardware using C and Python languages. Therefore, the reader should become familiar with the hardware to be used. This chapter aims to introduce these concepts. To do so, we will assume a novice user as our target. Besides, we will cover all hardware topics as abstract as possible. Hence, they can give insight on similar platforms. As for embedded hardware, we will pick the STMicroelectronics NUCLEO-F767ZI development board (STM32 board) and STM32F767ZI microcontroller (STM32 microcontroller) on it. These are the mediums our C and Python codes for digital control will be implemented on. Afterward, we will introduce the DC motor, its driver, and related hardware to be used in examples throughout the book. Finally, we will introduce other systems and sensors which can be used in advanced applications. As all the hardware is introduced, we will be ready to use them in practical digital control applications in solving real-life problems.

2.1 The STM32 Board

Our C and Python codes for digital control will run on the STM32F767ZI microcontroller. However, we cannot use this microcontroller alone since it needs extra hardware to operate. There should be programming and debugging circuitry accompanying the microcontroller. Hence, it can be programmed easily. For these reasons, development boards emerged. These have all the necessary circuitry on them. Therefore, they provide a complete environment to use the microcontroller. In this book, we pick the STMicroelectronics NUCLEO-F767ZI development board for this purpose. For the sake of brevity, we will call it as the STM32 board from this point on. In this section, we will provide general information about the board. We will also provide the pin layout. This will be mandatory to interface the microcontroller with outside world. We will also evaluate methods to program and power the board.

2.1.1 General Information

The STM32 board is as in Figure 2.1. This board has an STM32F767ZI microcontroller on it. Besides, it has three user LEDs, one user push button and one reset push button. It has a 32768?kHz crystal oscillator on it. Board connectors, which lead to access to all microcontroller input and output pins, are compatible with Arduino. The STM32 board has an on-board ST-LINK debugger/programmer with USB connectivity. For more information on the development board, please see https://www.st.com/en/evaluation-tools/nucleo-f767zi.html.

2.1.2 Pin Layout

Pin layout of the STM32 board is as in Figure 2.2. As can be seen in this figure, pins are gathered under four connectors as CN7, CN8, CN9, and CN10. Within each connector, there are input and output pins labeled as PA, PB, PC, PD, PE, PF, PG, and PH. The STM32 board also has two unmounted connecters called CN11 and CN12. We will not explain them here.

Pins on the STM32 board can be used for various purposes. Usage areas of each pin are summarized in Appendix A from this book's perspective. We will explore each property separately in the following sections.

We should also mention the pin connection of onboard green, blue, red LEDs, and push button on the STM32 board. The onboard green LED is connected to pin PB0. The onboard blue LED is connected to pin PB7. The onboard red LED is connected to pin PB14. The onboard user push button is connected to pin PC13. The reader should use the mentioned pins to reach the onboard LEDs and push button in the following chapters.

Figure 2.1 The STM32 board.

(Source: STMicroelectronics. Used with permission.)

Figure 2.2 Pin layout of the STM32 board.

(Source: Nucleo-F767ZI Zio Header, used with permission of STMicroelectronics.)

2.1.3 Powering and Programming the Board

The microcontroller on the STM32 board can be programmed easily by the on-board ST-LINK debugger/programmer. To do so, we should connect the board to PC via USB connection. We will introduce methods to program the microcontroller using this connection in Chapter 3.

The USB connection for debugging/programming purposes can also be used to power the board. Hence, whenever the board is connected to PC, it runs by the provided power. Likewise, we can use a USB battery pack to power the board in the same setup. We can also use an external power supply to power the board. To do so, we should use the relevant pins on the board. These will be sufficient to use the board in stand-alone applications.

The STM32 microcontroller operates within the voltage range of 1.71-3.6 V. We call this value as supply voltage () throughout the book. Let us explain the voltage range in detail. The actual working voltage level for the microcontroller is 3.6 V. This supply voltage may be decreased till 1.7 V for some low power operations. To note here, some peripheral modules will not work at this voltage level.

2.2 The STM32 Microcontroller

As mentioned earlier, the STM32 board is equipped with the STM32F767ZI microcontroller. For the sake of brevity, we will call it as the STM32 microcontroller from this point on. We will evaluate the properties of this microcontroller in this section. Let us start with the functional block diagram of the STM32 microcontroller given in Figure 2.3. As can be seen in this figure, there are several modules in the microcontroller. Besides, interconnection of these modules is complex. However, we will only cover the relevant modules to be used throughout the book here. For more information on other modules of the STM32 microcontroller, please see https://www.st.com/en/microcontrollers-microprocessors/stm32f767zi.html.

2.2.1 Central Processing Unit

Central processing unit (CPU) is the main module responsible for organizing all operations within the microcontroller. This is done by executing the code fed to it. The code can be written in C or MicroPython languages (for this book) with different execution phases. For more information on this topic, please consult a microcontroller book such as (Yiu 2013).

Figure 2.3 Functional block diagram of the STM32 microcontroller.

The CPU in the STM32 microcontroller is based on the Arm Cortex-M7 architecture. Let us explain this in more detail. Arm produces CPU cores in soft form (called as IPs). Microcontroller vendors, such as ST Microelectronics, purchase the right to use these IPs and develop microcontroller hardware. The advantage of this model is as follows. When different vendors use the same CPU core by Arm, they will have the same instruction set and properties. Therefore, the code developed for one microcontroller can be ported to another microcontroller from a different vendor. There is one important issue here. The microcontroller is not only composed of CPU. It also has peripheral units (to be explained next). These may differ for different vendors. Therefore, it may not be possible to directly port the code generated for one microcontroller to another (produced by a different vendor) when peripheral units are used.

Operations within the CPU are done in clock cycles. Before going further, let us first explain what the clock signal means. Clock is a periodic square wave generated by an oscillator. Frequency of the clock signal is measured in Hertz (Hz) which indicates how many periodic pulses occur in one second. The CPU depends on the clock signal. For the STM32 microcontroller, this clock frequency is maximum 216 MHz. The processor performs an action corresponding to an instruction execution phase with each clock cycle. Assuming that an instruction requires four clock cycles to execute, the CPU can process 54000000 instructions per second. Hence, higher the frequency of clock signal, the faster operations are performed within the CPU.

2.2.2 Memory

The microcontroller needs a medium to keep the code to be executed and variables to be operated on. The relevant medium in the microcontroller is called memory. Unless the microcontroller is using an additional external memory, the core memory is always on the microcontroller chip.

There are two memory regions on the microcontroller as flash and RAM. Codes to be executed are kept in the flash. As power of the microcontroller is turned down, codes remain there. Therefore, flash resembles the solid-state drive (SSD) on PC. Although the recent SSD storage size for a PC is reasonable, memory space in flash of a microcontroller is very limited. For the STM32 microcontroller, this is 2 MB. Therefore, the user should prepare his or her digital control code such that it does not exceed this limit. Fortunately, most digital control algorithms fit into this space.

The medium for temporary storage in the microcontroller is called RAM. Hence, variables to be executed in the code are kept there. This is similar to the RAM on PC with one difference. The RAM on the microcontroller is very limited in storage size. For the STM32 microcontroller, the RAM size is 512 kB. Therefore, the reader should use this space with care.

2.2.3 Input and Output Ports

A port in the microcontroller mean is a group of pins (or wires). These are used to input data to the microcontroller or output data from the microcontroller. Hence, the microcontroller can interact with the outside world through its input...

Dateiformat: ePUB
Kopierschutz: Adobe-DRM (Digital Rights Management)


Computer (Windows; MacOS X; Linux): Installieren Sie bereits vor dem Download die kostenlose Software Adobe Digital Editions (siehe E-Book Hilfe).

Tablet/Smartphone (Android; iOS): Installieren Sie bereits vor dem Download die kostenlose App Adobe Digital Editions (siehe E-Book Hilfe).

E-Book-Reader: Bookeen, Kobo, Pocketbook, Sony, Tolino u.v.a.m. (nicht Kindle)

Das Dateiformat ePUB ist sehr gut für Romane und Sachbücher geeignet - also für "fließenden" Text ohne komplexes Layout. Bei E-Readern oder Smartphones passt sich der Zeilen- und Seitenumbruch automatisch den kleinen Displays an. Mit Adobe-DRM wird hier ein "harter" Kopierschutz verwendet. Wenn die notwendigen Voraussetzungen nicht vorliegen, können Sie das E-Book leider nicht öffnen. Daher müssen Sie bereits vor dem Download Ihre Lese-Hardware vorbereiten.

Bitte beachten Sie bei der Verwendung der Lese-Software Adobe Digital Editions: wir empfehlen Ihnen unbedingt nach Installation der Lese-Software diese mit Ihrer persönlichen Adobe-ID zu autorisieren!

Weitere Informationen finden Sie in unserer E-Book Hilfe.

Download (sofort verfügbar)

103,99 €
inkl. 7% MwSt.
Download / Einzel-Lizenz
ePUB mit Adobe-DRM
siehe Systemvoraussetzungen
E-Book bestellen