日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

外设驱动库开发笔记42:DAC8552 DAC驱动

發布時間:2023/12/20 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 外设驱动库开发笔记42:DAC8552 DAC驱动 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??模擬信號輸出是經常會遇到的應用需求,解決的辦法應多種,但我們使用最多的還是數模轉換。對于不同的數模轉換器我們需要為其編寫適用的驅動程序,在這一篇中我們就來考慮如何實現DAC8552高精度模數轉換器的驅動程序。

1、功能概述

??該DAC8552是一個16位,雙通道,電壓輸出數模轉換器(DAC)提供低功率操作和靈活的串行主機接口。每個芯片上的精確輸出放大器允許軌到軌輸出擺動,以實現在2.7V到5.5V的供應范圍。該設備支持標準三線串行接口,能夠操作與輸入數據時鐘頻率高達30MHz的VDD = 5V。

1.1、功能結構

??DAC8552這種設備在正常情況下的低功耗使得它非常適合便攜式、電池驅動設備和其他低功耗應用。采用SOIC-8的封裝形式,引腳定義如下:

??DAC8552需要一個外部參考電壓來設置每個DAC通道的輸出范圍。DAC8552還包括一個電源上電復位電路,以確保DAC輸出功率能夠輸出到零,并保持在那里,直到獲取一個有效的寫入值。DAC8552擁有一個SPI串行接口,該接口提供了靈活的功能。

??從上述結構圖可知,DAC8552每次僅能操作一路輸出,因為全部的操作都是通過同一個移位寄存器來實現的。

1.2、移位寄存器

??DAC8552有一個24位的輸入移位寄存器,前面8位用來作控制位,后面16位用作數據位。具體如下圖所示:

??在前面的8位控制位中,DB23和DB22是保留位必須為“0”,DB21(LDB)位和DB20(LDA)用于控制后面的16位數據適用于加載哪一個輸出通道還是Power_Down命令。DB19沒有定義,DAC8552不關心該位的具體數值。DB18為緩沖器選擇位,用于控制數據的目標通道是DAC A還是DAC B。后續的DB17(PD1)和DB16(PD0)用于選擇Power_Down的模式。具體的命令如下表中描述:

??至于Power_Down的模式有幾種選擇,如下表所示:

2、驅動設計與實現

??我們已經了解了DAC8552的基本結構及寄存器命令,接下來我們將根據這些認知設計DAC8552的驅動程序。

2.1、對象定義

??在設計DAC8552的驅動程序之前,我們先來考慮一下DAC8552的對象定義問題。我們作為一個對象一般會包括屬性和操作兩個方面的內容。我們先來分析DAC8552對象應該包含有哪些屬性。屬性用于標識對象的某些特性,DAC8552通過SPI總線下發數據和命令,我們沒有發現什么需要特別標記的特性,所以我們不需要為DAC8552對象設計屬性。
??我們再來看一看,DAC8552對象需要實現哪些操作。首先DAC8552使用SPI總線進行通訊,而SPI總線采用片選信號來區分不同的節點,所以我們需要操作DAC8552的片選信號,而片選型號的操作顯然依賴于特定的操作平臺,所以我們將控制其片選信號作為DAC8552對象的一個操作。另外,DAC8552作為模擬量輸出對象,我們需要向其發送命令和數據,而向其發送數據和命令也依賴于具體的操作平臺,所以應將其作為對象的一個操作來實現。據此我們可以定義DAC8552的對象類型如下:

/* 定義DAC8552對象類型 */ typedef struct DAC8552Object {void (*WriteDataToDAC)(uint8_t *tData,uint16_t tSize); //向DAC發送數據void (*ChipSelcet)(DAC8552CSType cs); //片選信號 }DAC8552xObjectType;

??我們定義了DAC8552的對象類型,但當我們使用其聲明一個對象時,并不能直接使用,我們需要對對象進行初始化,這就需要我們設計一個對象初始化的函數。對象初始化函數處理對象相關的屬性和操作的配置,具體實現如下:

/*初始化DAC8552對象*/ void DAC8552Initialization(DAC8552xObjectType *dac, //DAC8552對象變量DAC8552WriteType write, //寫數據函數指針DAC8552ChipSelectType cs //片選操作函數指針) {if((dac==NULL)||(write==NULL)){return;}if(cs!=NULL){dac->ChipSelcet=cs;}else{dac->ChipSelcet=DefaultChipSelect;} }

2.2、對象操作

??我們已經定義了DAC8552的對象類型并為DAC8552對象設計了初始化函數,接下來我們看一看DAC8552所要實現的操作。對于DAC8552對象來說,我們對其操作無非就是寫其移位寄存器以實現命令和數據的下發。從其數據表中我們可以看到操作移位寄存器的時序如下所示:

??根據我們前面對DAC8552相關數據的了解以及上述時序圖,我們可以封裝對其移位寄存器的操作函數如下:

/*操作DAC8552輸出通道*/ void SetDAC8552ChannelValue(DAC8552xObjectType *dac,DAC8552LDType ld,DAC8552BSType bs,DAC8552PDType pd,uint16_t data) {uint32_t inputShiftData=0;uint8_t sData[3];inputShiftData=data;inputShiftData=inputShiftData|(ld<<20);inputShiftData=inputShiftData|(bs<<18);inputShiftData=inputShiftData|(pd<<16);sData[0]=(uint8_t)(inputShiftData>>16);sData[1]=(uint8_t)(inputShiftData>>8);sData[2]=(uint8_t)inputShiftData;dac->ChipSelcet(DAC8552CS_Enable);dac->WriteDataToDAC(sData,3);dac->ChipSelcet(DAC8552CS_Disable); }

3、驅動的使用

??我們設計了DAC8552的對象驅動,但這個驅動是否正確我們需要驗證一下。所以接下來我們設計一個簡單的例子來實現對驅動程序的驗證。

3.1、聲明并初始化對象

??我們使用設計的驅動程序操作DAC8552時,首先需要使用我們定義的對象類型聲明一個DAC8552對象。

DAC8552xObjectType dac8552;

??聲明了這個對象變量之后,我們還需要使用初始化函數對其進行初始化方可使用。這一初始化函數擁有3個參數:

DAC8552xObjectType *dac, //DAC8552對象變量 DAC8552WriteType write, //寫數據函數指針 DAC8552ChipSelectType cs //片選操作函數指針

??第一個參數正是我們要初始化的對象變量;第二個參數為向DAC8552寫命令和數據的函數指針;第三個參數是片選信號操作函數指針。這兩個函數指針需要我們實現。它們的原型如下:

/* 向DAC發送數據函數指針類型 */ typedef void (*DAC8552WriteType)(uint8_t *tData,uint16_t tSize); /* 片選操作函數指針類型 */ typedef void (*DAC8552ChipSelectType)(DAC8552CSType cs);

??我們根據函數原型定義,在具體的實現平臺上實現它們,如我們在STM32平臺上實現如下:

/*定義片選信號函數*/ void DAC8552CS(DAC8552CSType en) {if(DAC8552CS_Enable==en){HAL_GPIO_WritePin(GPIOF, GPIO_PIN_4, GPIO_PIN_RESET);}else{HAL_GPIO_WritePin(GPIOF, GPIO_PIN_4, GPIO_PIN_SET);} }/*定義發送數據函數*/ void DAC8552TransmitData(uint8_t *wData,uint16_t wSize) {HAL_SPI_Transmit (&dac8552hspi, wData, wSize, 1000); }

??我們將對象變量以及上面實現的2個函數的函數指針作為參數傳遞給DAC8552對象初始化函數來實現對象變量的初始化。具體如下:

DAC8552Initialization(&dac8552, //DAC8552對象變量DAC8552TransmitData, //寫數據函數指針DAC8552CS //片選操作函數指針);

3.2、基于對象進行操作

??初始化對象變量后,我們就可以基于該對象變量實現我們對DAC8552的操作了。我們已經封裝了對其移位寄存器操作的函數,直接調用該函數來說實現我們的操作。一個簡單的實現函數如下:

/* 修改DAC8552的通道輸出 */ void DAC8552Operation(void) {uint16_t wData=0;wData=(uint16_t)(65535*tValueA/100);SetDAC8552ChannelValue(&dac8552, //所操作的DAC對象DAC8552_LoadA, //加載的通道DAC8552BS_BufferA, //選擇的緩存DAC8552PD_Normal, //Power-Down設置wData //所寫的數據);wData=(uint16_t)(65535*tValueB/100);SetDAC8552ChannelValue(&dac8552, //所操作的DAC對象DAC8552_LoadB, //加載的通道DAC8552BS_BufferB, //選擇的緩存DAC8552PD_Normal, //Power-Down設置wData //所寫的數據); }

??在這個例子中我們分別通過百分比設定值調整了A、B通道的輸出,實現在正常模式下操作A或者B通道,并更新指定的緩存。

4、應用總結

??我們設計并實現了DAC8552模數轉換器的驅動程序,并且設計了一個簡單的應用來驗證這一驅動程序的正確性。所得到的結果證明驅動的設計是沒有問題的,實際上我們已經將其運用到實際的項目中,效果良好。
??在使用驅動程序時需要注意,片選信號并非必須實現。因為有些時候我們可能需要在硬件上直接將其選中,此時添加片選操作函數是沒有什么意義的,我們可以在初始化時傳入NULL來完成。

歡迎關注:

總結

以上是生活随笔為你收集整理的外设驱动库开发笔记42:DAC8552 DAC驱动的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩视频在线视频 | 一级片免费的 | 牛牛av在线 | a级黄片毛片 | xxxxhd欧美| 亚洲成在人| 在线伊人网| 久久99精品久久久久久国产越南 | 国产精品一区二区在线播放 | 88国产精品视频一区二区三区 | 中文字幕在线视频免费播放 | 久久99影院 | 久久亚洲精少妇毛片午夜无码 | 国语对白自拍 | 精品999久久久一级毛片 | 久久亚洲无码视频 | 日本免费黄网站 | 好吊色视频988gao在线观看 | 少妇做爰免费理伦电影 | 亚洲偷拍一区 | av中文字幕网 | 亚洲国产成人精品女人久久久 | 色噜噜噜| 亚洲狠狠丁香婷婷综合久久久 | 99热免费在线观看 | 亚洲视频免费观看 | 日本免费三片在线播放 | 日本第一页 | 麻豆国产一区 | 丰满人妻一区二区三区四区53 | 网站黄在线| 无码播放一区二区三区 | 99精品视频一区二区三区 | 日韩视频一区二区三区四区 | 色成人综合 | 91视频合集 | 久久久亚洲欧美 | 午夜肉伦伦影院 | 精品日日夜夜 | 欧美69影院| 欧美国产二区 | 亚洲欧美日本在线 | 叼嘿视频91 | 亚洲色图狠狠干 | 青青青草视频在线 | 亚洲综合伊人 | 三级无遮挡 | 欧美韩国日本一区 | 日本午夜影院 | 国内精品久 | 久久三区 | 午夜精品久久久久久久久 | 亚洲黄色小说图片 | 国产又粗又深又猛又爽又在线观看 | 97在线国产 | 亚洲国产精品国自产拍久久 | 欧美在线不卡 | 精品成在人线av无码免费看 | 少妇偷人精品无码人妻 | 久久综合资源 | 亚洲逼逼 | 中文字幕日韩在线视频 | 国产成人精品一区二区三区在线 | 久久久夜色精品亚洲 | 五月天男人天堂 | 欧美首页| 亚洲国产极品 | 欧美在线一级 | 在线精品观看 | 国产在线看黄 | 中文字幕视频一区 | 精品国产专区 | 男人猛进女人爽的大叫 | 奇米7777| 无码人妻丰满熟妇啪啪 | 在线亚洲天堂 | 久久精品免费网站 | 国产永久免费 | 欧美12--15处交性娇小 | 69堂精品 | 国产精品xxx在线观看 | 性折磨bdsm欧美激情另类 | 91欧美精品 | 亚洲国产精品电影 | 亚洲精品国产精品乱码视色 | 亚洲毛片在线免费观看 | 性生交生活影碟片 | 一区二区三区在线观看免费 | 久久久久人妻一区二区三区 | 精品女同一区二区三区 | 国产精品男同 | 婷婷丁香花五月天 | 游戏涩涩免费网站 | 奇米影视首页 | 美女又爽又黄又免费 | 成人试看120秒体验区 | 日本中文字幕第一页 | 欧美亚洲一区二区在线观看 | 日本在线观看视频网站 |