久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1505|回復(fù): 0
收起左側(cè)

STM32筆記--DAC(正弦波發(fā)生)

[復(fù)制鏈接]
ID:318522 發(fā)表于 2020-4-20 15:37 | 顯示全部樓層 |閱讀模式
     DAC,與ADC相對,是數(shù)字量轉(zhuǎn)模擬量,經(jīng)常用來作為信號發(fā)生器,這里DAC一定要詳細記錄,但其實原理還是相對簡單。首先我們看一下

DAC的觸發(fā)源:



DAC的觸發(fā)源有6個定時器的更新時間和一個外部觸發(fā),一般外部觸發(fā)我們用于DAC的直流產(chǎn)生,所以我們這次使用的是定時器觸發(fā)。

DAC的主要特性:(來自官方手冊)

●2個DAC轉(zhuǎn)換器:1個輸出通道對應(yīng)1個轉(zhuǎn)換器
● 8位或者12位單調(diào)輸出
● 12位模式下數(shù)據(jù)左對齊或者右對齊
● 同步更新功能
● 噪聲波形生成
● 三角波形生成
● 雙DAC通道同時或者分別轉(zhuǎn)換
● 每個通道都有DMA功能
● 外部觸發(fā)轉(zhuǎn)換
● 輸入?yún)⒖茧妷篤 REF+

DAC配置的特殊注意點:

一旦使能 DAC 通道,相應(yīng)的 GPIO 管腳 (PA4 或者 PA5) 就會自動與 DAC 的模擬輸出相連(DAC_OUTx) 。為了避免寄生的干擾和額外的功耗,管腳 PA4 或者 PA5 在之前應(yīng)當(dāng)設(shè)置成模擬輸入 (AIN) 。

代碼講解(帶詳細注解,將整個工程用到的函數(shù)分開講解,更加清晰)

int main(void)
{
   DAC_Mode_Init();   //DAC模式初始化
   while(1);         
}

const uint16_t Sine12bit[32] = {
        2448,2832,3186,3496,3751,3940,4057,4095,4057,3940,
        3751,3496,3186,2832,2448,2048,1648,1264,910,600,345,
        156,39,0,39,156,345,600,910,1264,1648,2048
};


uint32_t DualSine12bit[32];

void DAC_Mode_Init(void)
{
        uint32_t Idx = 0;  

        DAC_Config();   //DAC初始化
        DAC_TIM_Config();    //定時器觸發(fā)配置
        DAC_DMA_Config();    //DMA配置
        for (Idx = 0; Idx < 32; Idx++)           //for循環(huán)給Dualsin12bit賦值,雙通道輸出原因看下圖
  {
    DualSine12bit[Idx] = (Sine12bit[Idx] << 16) + (Sine12bit[Idx]);   //每次傳輸一個12位數(shù)值+該值左移16位從而得到一個32位數(shù)值
  }
}

這是一個32位的寄存器,我們每次都往里面寫一次相應(yīng)數(shù)值,循環(huán)輸出,從而得到正弦波。看下圖可加深理解



static void DAC_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  DAC_InitTypeDef  DAC_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);          //開啟APB2的gpioa的時鐘
        
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);   //開啟APB1的DAC時鐘,DAC掛載于APB1的通道4
        
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 | GPIO_Pin_5;    //開啟GPIOA4 和 A5
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;     //設(shè)置為模擬輸入(看上面注意點,重要)
  GPIO_Init(GPIOA, &GPIO_InitStructure);     //寫入結(jié)構(gòu)體
        

  DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;          //設(shè)置為TIM2更新,即設(shè)置TIM2作為觸發(fā)源                                       
  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;        //不使用波形發(fā)生器
  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;        //不適用輸出緩沖,若如要輸出電流可配置
  DAC_Init(DAC_Channel_1, &DAC_InitStructure);             //初始化通道一
  DAC_Init(DAC_Channel_2, &DAC_InitStructure);             //初始化通道二

  DAC_Cmd(DAC_Channel_1, ENABLE);    //使能通道一

  DAC_Cmd(DAC_Channel_2, ENABLE);   //使能通道二

  DAC_DMACmd(DAC_Channel_2, ENABLE);   //使能DAC對DMA的請求
}

static void DAC_TIM_Config(void)
{
        
  TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
        
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);    //使能定時器2
        
// TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  TIM_TimeBaseStructure.TIM_Period = 19;      //計時到20會更新一次                                                                  
  TIM_TimeBaseStructure.TIM_Prescaler = 0x0;      // 內(nèi)部1分頻,也就是計數(shù)器時鐘為72M                                                  
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;            //外部不分頻(沒用到)                                
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;          //向上計數(shù)
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);   // 配置觸發(fā)源
  TIM_Cmd(TIM2, ENABLE);   //使能 TIM2

}



static void DAC_DMA_Config(void)
{        
        DMA_InitTypeDef  DMA_InitStructure;

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);  //使能DMA2
        
  DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12RD_Address;      //定義為雙通道模式,其他模式請看手冊                                
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&DualSine12bit ;    //定義的寫入寄存器的32位數(shù)組                        
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                       //傳輸方向為內(nèi)存到外設(shè)                                       
  DMA_InitStructure.DMA_BufferSize = 32;                               //緩存大小32位                                       
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;     //外設(shè)地址固定        
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;               //內(nèi)存地址自增        
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;        //外設(shè)傳輸一個字節(jié)
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;                //內(nèi)存?zhèn)鬏斠粋字節(jié)                        
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                                //循環(huán)輸出                                       
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;                                //優(yōu)先級為高                                       
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                        //禁止內(nèi)存間傳輸                                       
  DMA_Init(DMA2_Channel4, &DMA_InitStructure);                                  //開啟DMA通道4        
  DMA_Cmd(DMA2_Channel4, ENABLE);                                               //使能
}
#define DAC_DHR12RD_Address      0x40007420 //0x40007420   
DAC內(nèi)存地址0x40007420,兩位輸出寄存器偏移20,其他模式地址請查找手冊




回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产玖玖| 成人精品影院 | 亚洲精品欧美 | 91精品国产乱码久久久久久久久 | 欧美v片 | 日韩成人免费在线视频 | 亚洲国产一区二区三区, | 久久三区 | 毛片免费视频 | 国产精品美女久久久 | 国产精品性做久久久久久 | 欧美黄色一区 | 久久夜夜 | 一级片av| 亚洲一区二区三区免费视频 | 丝袜久久| 久久精品国产亚洲 | 欧美日韩在线观看视频 | 午夜小视频在线播放 | 一级a性色生活片久久毛片 一级特黄a大片 | 日韩一区二区av | 久久精品国产免费看久久精品 | 嫩草视频在线 | 国产91精品在线 | 日韩爱爱网站 | 岛国视频| 亚洲www啪成人一区二区 | 四虎成人在线播放 | 精品成人免费一区二区在线播放 | 国产精品99久久久精品免费观看 | 亚洲综合大片69999 | 毛片一级网站 | 国产一区黄色 | 日韩免费高清视频 | 日本一区二区视频 | 国产精品久久久一区二区三区 | 精品久久久久一区二区国产 | 日本精品视频在线 | 国产精品久久久久aaaa九色 | 国产69精品久久99不卡免费版 | 亚洲日日夜夜 |