|
DAC,與ADC相對(duì),是數(shù)字量轉(zhuǎn)模擬量,經(jīng)常用來(lái)作為信號(hào)發(fā)生器,這里DAC一定要詳細(xì)記錄,但其實(shí)原理還是相對(duì)簡(jiǎn)單。首先我們看一下
DAC的觸發(fā)源:
DAC的觸發(fā)源有6個(gè)定時(shí)器的更新時(shí)間和一個(gè)外部觸發(fā),一般外部觸發(fā)我們用于DAC的直流產(chǎn)生,所以我們這次使用的是定時(shí)器觸發(fā)。
DAC的主要特性:(來(lái)自官方手冊(cè))
●2個(gè)DAC轉(zhuǎn)換器:1個(gè)輸出通道對(duì)應(yīng)1個(gè)轉(zhuǎn)換器
● 8位或者12位單調(diào)輸出
● 12位模式下數(shù)據(jù)左對(duì)齊或者右對(duì)齊
● 同步更新功能
● 噪聲波形生成
● 三角波形生成
● 雙DAC通道同時(shí)或者分別轉(zhuǎn)換
● 每個(gè)通道都有DMA功能
● 外部觸發(fā)轉(zhuǎn)換
● 輸入?yún)⒖茧妷篤 REF+
DAC配置的特殊注意點(diǎn):
一旦使能 DAC 通道,相應(yīng)的 GPIO 管腳 (PA4 或者 PA5) 就會(huì)自動(dòng)與 DAC 的模擬輸出相連(DAC_OUTx) 。為了避免寄生的干擾和額外的功耗,管腳 PA4 或者 PA5 在之前應(yīng)當(dāng)設(shè)置成模擬輸入 (AIN) 。
代碼講解(帶詳細(xì)注解,將整個(gè)工程用到的函數(shù)分開(kāi)講解,更加清晰)
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(); //定時(shí)器觸發(fā)配置
DAC_DMA_Config(); //DMA配置
for (Idx = 0; Idx < 32; Idx++) //for循環(huán)給Dualsin12bit賦值,雙通道輸出原因看下圖
{
DualSine12bit[Idx] = (Sine12bit[Idx] << 16) + (Sine12bit[Idx]); //每次傳輸一個(gè)12位數(shù)值+該值左移16位從而得到一個(gè)32位數(shù)值
}
}
這是一個(gè)32位的寄存器,我們每次都往里面寫(xiě)一次相應(yīng)數(shù)值,循環(huán)輸出,從而得到正弦波?聪聢D可加深理解
static void DAC_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //開(kāi)啟APB2的gpioa的時(shí)鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); //開(kāi)啟APB1的DAC時(shí)鐘,DAC掛載于APB1的通道4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; //開(kāi)啟GPIOA4 和 A5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //設(shè)置為模擬輸入(看上面注意點(diǎn),重要)
GPIO_Init(GPIOA, &GPIO_InitStructure); //寫(xiě)入結(jié)構(gòu)體
DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO; //設(shè)置為T(mén)IM2更新,即設(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對(duì)DMA的請(qǐng)求
}
static void DAC_TIM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定時(shí)器2
// TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = 19; //計(jì)時(shí)到20會(huì)更新一次
TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 內(nèi)部1分頻,也就是計(jì)數(shù)器時(shí)鐘為72M
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //外部不分頻(沒(méi)用到)
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計(jì)數(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; //定義為雙通道模式,其他模式請(qǐng)看手冊(cè)
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&DualSine12bit ; //定義的寫(xiě)入寄存器的32位數(shù)組
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //傳輸方向?yàn)閮?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è)傳輸一個(gè)字節(jié)
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; //內(nèi)存?zhèn)鬏斠粋(gè)字節(jié)
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //循環(huán)輸出
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //優(yōu)先級(jí)為高
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //禁止內(nèi)存間傳輸
DMA_Init(DMA2_Channel4, &DMA_InitStructure); //開(kāi)啟DMA通道4
DMA_Cmd(DMA2_Channel4, ENABLE); //使能
}
#define DAC_DHR12RD_Address 0x40007420 //0x40007420
DAC內(nèi)存地址0x40007420,兩位輸出寄存器偏移20,其他模式地址請(qǐng)查找手冊(cè)
|
|