{"id":247,"date":"2017-11-23T00:12:51","date_gmt":"2017-11-22T23:12:51","guid":{"rendered":"http:\/\/mikrocontroller.bplaced.net\/wordpress\/?page_id=247"},"modified":"2023-03-05T00:01:56","modified_gmt":"2023-03-04T23:01:56","slug":"24-dac_dma-library-stm32f4","status":"publish","type":"page","link":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/?page_id=247","title":{"rendered":"24-DAC_DMA-Library (STM32F4)"},"content":{"rendered":"<p><div id=\"nav-below\" class=\"navigation\"><div class=\"nav-previous\"><a href=\"https:\/\/mikrocontroller.bplaced.net\/wordpress\/?page_id=245\" title=\"23-DAC-Library (STM32F4)\"><span class=\"meta-nav\">\u2190<\/span> 23-DAC-Library (STM32F4)<\/a><\/div><\/div><!-- #nav-below --><div id=\"nav-below\" class=\"navigation\"><div class=\"nav-next\"><a href=\"https:\/\/mikrocontroller.bplaced.net\/wordpress\/?page_id=249\" title=\"25-PWM-Library (STM32F4)\">25-PWM-Library (STM32F4) <span class=\"meta-nav\">&rarr;<\/span><\/a><\/div><\/div><!-- #nav-below --><\/p>\n<p>Mit dieser Library kann der DAC vom STM32F4 (entweder einer oder beide) per DMA betrieben werden.<\/p>\n<p>Der Sinn ist, eine Kurvenform per DAC (zyklisch) auszugeben. Dazu m\u00fcssen die Datenwerte der Kurve in einem Array vorliegen.<\/p>\n<p>Ich hab in der Library mal zum Test 4 Kurvenformen eingetragen<br \/>\n(Sinus, S\u00e4gezahn, Dreieck, Rechteck \u2026 und noch eine f\u00fcr ein Dauer-Lo-Pegel)<\/p>\n<p>Mit einer extra Funktion kann die Frequenz der Kurvenform eingestellt werden. Wobei man eigentlich den Vorteiler und den Comparewert vom Timer einstellt. Diese beiden Werte muss man vorher ausrechnen.<br \/>\n(die Frequenz ist auch Abh\u00e4ngig wie viele Datenwerte die Kurvenform besitzt)<\/p>\n<p>Welcher Timer benutzt werden soll, muss im H-File per Define eingestellt werden.<br \/>\nIch hab Timer6 und Timer7 benutzt, es geht aber auch TIM2, TIM4,TIM5)<\/p>\n<p>Beim DAC per DMA scheint ein BUG vorzuliegen, wenn die Variable \u201cDAC_InitStructure\u201d nicht Global definiert wird, kommt es sporadisch zu Fehlern das der DAC nicht l\u00e4uft.<\/p>\n<p><strong>Beispielbild :<\/strong><\/p>\n<p><a href=\"http:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-content\/uploads\/2013\/03\/dac_dma.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1034\" src=\"http:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-content\/uploads\/2013\/03\/dac_dma-300x179.jpg\" alt=\"dac_dma\" width=\"300\" height=\"179\" \/><\/a><\/p>\n<p>Die DA-Wandler liegen an festen Pins der CPU :<\/p>\n<pre lang=\"c\" line=\"1\">DAC1 an PA4\r\nDAC2 an PA5<\/pre>\n<p><strong>Voraussetzungen :<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">Benutzte Module der CooCox-IDE : GPIO, DAC, DMA, TIM\r\nBenutzte Librarys : keine<\/pre>\n<p><strong>Enumerationen :<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">typedef enum {\r\n  SINGLE_DAC1_DMA = 0, \/\/ nur DAC1 an PA4 benutzen\r\n  SINGLE_DAC2_DMA,     \/\/ nur DAC2 an PA5 benutzen\r\n  DUAL_DAC_DMA         \/\/ DAC1 (PA4) und DAC2 (PA5) benutzen\r\n}DAC_DMA_MODE_t;<\/pre>\n<p><strong>.<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">typedef enum {\r\n  DAC_WAVE_OFF          = 0,    \/\/ Dauer Lo-Pegel\r\n  DAC_WAVE1_SINUS       = 1,    \/\/ Waveform1 (Sinus)\r\n  DAC_WAVE2_SAEGEZAHN   = 2,    \/\/ Waveform2 (S\u00e4gezahn)\r\n  DAC_WAVE3_DREIECK     = 3,    \/\/ Waveform3 (Dreieck)\r\n  DAC_WAVE4_RECHTECK    = 4     \/\/ Waveform4 (Rechteck)\r\n}DAC_DMA_WAVE_NAME_t;<\/pre>\n<p><strong>Funktionen :<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">void UB_DAC_DMA_Init(DAC_DMA_MODE_t mode);                     \/\/ um den DAC zu initialisieren\r\nvoid UB_DAC_DMA_SetWaveform1(DAC_DMA_WAVE_NAME_t wave);        \/\/ zum einstellen einer Kurvenform f\u00fcr DAC1\r\nvoid UB_DAC_DMA_SetWaveform2(DAC_DMA_WAVE_NAME_t wave);        \/\/ zum einstellen einer Kurvenform f\u00fcr DAC2\r\nvoid UB_DAC_DMA_SetFrq1(uint16_t vorteiler, uint16_t periode); \/\/ zum einstellen der Frq von DAC1\r\nvoid UB_DAC_DMA_SetFrq2(uint16_t vorteiler, uint16_t periode); \/\/ zum einstellen der Frq von DAC2<\/pre>\n<p><strong>Beispiel :<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">\/\/--------------------------------------------------------------\r\n\/\/ File     : main.c\r\n\/\/ Datum    : 24.03.2013\r\n\/\/ Version  : 1.0\r\n\/\/ Autor    : UB\r\n\/\/ EMail    : mc-4u(@)t-online.de\r\n\/\/ Web      : www.mikrocontroller-4u.de\r\n\/\/ CPU      : STM32F4\r\n\/\/ IDE      : CooCox CoIDE 1.7.0\r\n\/\/ Module   : CMSIS_BOOT, M4_CMSIS_CORE\r\n\/\/ Funktion : Demo der DAC-DMA Library\r\n\/\/ Hinweis  : Diese zwei Files muessen auf 8MHz stehen\r\n\/\/              \"cmsis_boot\/stm32f4xx.h\"\r\n\/\/              \"cmsis_boot\/system_stm32f4xx.c\"\r\n\/\/--------------------------------------------------------------\r\n\r\n#include \"main.h\"\r\n#include \"stm32_ub_dac_dma.h\"\r\n\r\nint main(void)\r\n{\r\n  SystemInit(); \/\/ Quarz Einstellungen aktivieren\r\n\r\n  \/\/ init vom DAC im DMA-Mode (DAC-1 und DAC-2)\r\n  UB_DAC_DMA_Init(DUAL_DAC_DMA);\r\n\r\n  \/\/ an DAC1 (PA4) ein Sinus-Signal ausgeben\r\n  UB_DAC_DMA_SetWaveform1(DAC_WAVE1_SINUS);\r\n\r\n  \/\/ an DAC2 (PA5) ein Dreieck-Signal ausgeben\r\n  UB_DAC_DMA_SetWaveform2(DAC_WAVE3_DREIECK);\r\n\r\n  \/\/ Frq vom Sinus-Signal auf 1 Hz stellen\r\n  \/\/ Das Sinus-Signal ist 32 Werte lang\r\n  \/\/ f=84MHz\/300\/8750\/32 = 1 Hz\r\n  UB_DAC_DMA_SetFrq1(299,8749);\r\n\r\n  \/\/ Frq vom Dreieck-Signal auf 10 Hz stellen\r\n  \/\/ Das Dreieck-Signal ist 32 Werte lang\r\n  \/\/ f=84MHz\/30\/8750\/32 = 10 Hz\r\n  UB_DAC_DMA_SetFrq2(29,8749);\r\n\r\n  while(1)\r\n  {\r\n\r\n  }\r\n}\r\n<\/pre>\n<p>Hier die Library zum\u00a0<strong>Download :<\/strong><\/p>\n<p><a href=\"https:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-content\/uploads\/2013\/03\/ub_stm32f4_dac_dma_v101.zip\">ub_stm32f4_dac_dma_v101<\/a><\/p>\n<p>Hier der komplette CooCox-Projektordner zum\u00a0<strong>Download :<\/strong><\/p>\n<p><a href=\"https:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-content\/uploads\/2013\/03\/Demo_24_DAC_DMA.zip\">Demo_24_DAC_DMA<\/a><\/p>\n<h3 id=\"comments-title\">9 Antworten auf <em>24-DAC_DMA-Library (STM32F4)<\/em><\/h3>\n<ol class=\"commentlist\">\n<li id=\"li-comment-769\" class=\"comment even thread-even depth-1\">\n<div id=\"comment-769\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/1.gravatar.com\/avatar\/b894d67379dd0647dd316009f47155d2?s=40&amp;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">Joerg<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">9. September 2013 um 21:42<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>wie viel Kan\u00e4le gehen gleichzeitig beim F4 ?<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/p>\n<ul class=\"children\">\n<li id=\"li-comment-772\" class=\"comment byuser comment-author-admin_ub bypostauthor odd alt depth-2\">\n<div id=\"comment-772\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/67426419ead44d5afa132e92685bb460?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">admin_ub<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">10. September 2013 um 19:19<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Der STM32F4 hat intern zwei DAC Kan\u00e4le.<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/li>\n<\/ul>\n<\/li>\n<li id=\"li-comment-2902\" class=\"comment even thread-odd thread-alt depth-1\">\n<div id=\"comment-2902\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/e7080ea539654ba11808501983c08c88?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">victor<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">16. Februar 2015 um 13:52<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Hello,<br \/>\nthis program is awesome. I need to do something similar with the same board (STM32F4). I need to make a rectangular wave and transmit that to a h-bridge (chip) and then to an ultrasonic sensor. The thing is that the chip works between 4,5 and 36 V. The other thing is that the chip works with digital signal so it\u2019s not necessary to convert from digital to analog.<br \/>\nCan someone help me please?<br \/>\nIn an other blog someone told me that I need to connect a extern pull-up resistor or something like this.<\/p>\n<p>Thank you<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/p>\n<ul class=\"children\">\n<li id=\"li-comment-2962\" class=\"comment odd alt depth-2\">\n<div id=\"comment-2962\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/0ac1aae3f5fdfe8a74e80bd875e99c46?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">h.w<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">11. M\u00e4rz 2015 um 22:54<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>I think you can try level shifter, like this:<br \/>\n<a href=\"https:\/\/www.sparkfun.com\/products\/12009\" rel=\"nofollow\">https:\/\/www.sparkfun.com\/products\/12009<\/a><\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/p>\n<ul class=\"children\">\n<li id=\"li-comment-2963\" class=\"comment even depth-3\">\n<div id=\"comment-2963\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/0ac1aae3f5fdfe8a74e80bd875e99c46?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">h.w<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">11. M\u00e4rz 2015 um 23:07<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>And an article I found useful:<br \/>\n<a href=\"http:\/\/codeandlife.com\/2012\/04\/06\/level-shifting-101\/\" rel=\"nofollow\">http:\/\/codeandlife.com\/2012\/04\/06\/level-shifting-101\/<\/a><\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li id=\"li-comment-3013\" class=\"comment odd alt thread-even depth-1\">\n<div id=\"comment-3013\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/1.gravatar.com\/avatar\/f5bb9a288869284948523b2beb747093?s=40&amp;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">Jack<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">20. M\u00e4rz 2015 um 10:37<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>It\u2019s very cool project.<br \/>\nIf I need DAC1 and DAC2 output sample wave, for example sine waves, I want to set amplitude\/frequence, as well as the phase-shift between DAC1 and DAC1 . How can I do this?<\/p>\n<p>thank you<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/p>\n<ul class=\"children\">\n<li id=\"li-comment-3018\" class=\"comment byuser comment-author-admin_ub bypostauthor even depth-2\">\n<div id=\"comment-3018\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/67426419ead44d5afa132e92685bb460?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">admin_ub<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">21. M\u00e4rz 2015 um 10:07<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>you can copy the sinus array into ram and shift the phase by reordering the items. But the original sinus array has only 32 items, so the smallest shift is about 11 degree. If you want a better result, increase the number of items.<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/li>\n<\/ul>\n<\/li>\n<li id=\"li-comment-3014\" class=\"comment odd alt thread-odd thread-alt depth-1\">\n<div id=\"comment-3014\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/1.gravatar.com\/avatar\/f5bb9a288869284948523b2beb747093?s=40&amp;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">Jack<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">20. M\u00e4rz 2015 um 10:53<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Can the output voltage only be 0~3V? or can be -1.5~+1.5V as well as -3~0V.<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/p>\n<ul class=\"children\">\n<li id=\"li-comment-3019\" class=\"comment byuser comment-author-admin_ub bypostauthor even depth-2\">\n<div id=\"comment-3019\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/67426419ead44d5afa132e92685bb460?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">admin_ub<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">21. M\u00e4rz 2015 um 10:09<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>you need an external level shifter . search in google how to do that with an op and some resistors.<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Mit dieser Library kann der DAC vom STM32F4 (entweder einer oder beide) per DMA betrieben werden. Der Sinn ist, eine Kurvenform per DAC (zyklisch) auszugeben. Dazu m\u00fcssen die Datenwerte der Kurve in einem Array vorliegen. Ich hab in der Library &hellip; <a href=\"https:\/\/mikrocontroller.bplaced.net\/wordpress\/?page_id=247\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":144,"menu_order":24,"comment_status":"open","ping_status":"closed","template":"","meta":{"footnotes":""},"categories":[128],"tags":[181,9,7],"class_list":["post-247","page","type-page","status-publish","hentry","category-stm32f4","tag-dac","tag-library","tag-stm32f4"],"_links":{"self":[{"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/pages\/247","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=247"}],"version-history":[{"count":5,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/pages\/247\/revisions"}],"predecessor-version":[{"id":3677,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/pages\/247\/revisions\/3677"}],"up":[{"embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/pages\/144"}],"wp:attachment":[{"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=247"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=247"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=247"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}