1.DAC數模轉換
DAC(digital to analog converter)即數模轉換器,它可以將數字信號轉換為模擬信號,它的功能與ADC相反。在常見的數字信號系統中,大部分傳感器信號被轉化成電壓信號,而ADC把電壓模擬信號轉換成易于計算機存儲、處理的數字編碼,由計算機處理完成后,再由DAC輸出電壓模擬信號來驅動某些執行器件,使人類易于感知。如音頻信號的采集和還原就是這樣的一個過程
STM32F1的DAC模塊是12位數字輸入,電壓輸出型的DAC。可以配置為8位或12位模式,也可以與DMA控制器配合使用,DAC工作在12位模式下時,數據可以設置為左對齊或右對齊。DAC模塊有2個輸出通道,每個通道都有單獨的轉換器。在雙DAC模式下,2個通道可以獨立地進行轉換,也可以同時進行轉換并同步地更新2個通道的輸出。DAC可以通過引腳輸入參考電壓VREF+以獲得更精確的轉換結果。DAC結構框圖如下示:
VDDA和VSSA是DAC模塊的供電引腳,VREF+是DAC模塊的參考電壓,DAC_OUTx是DAC的輸出通道;當參考電壓為VREF+時,DAC的輸出電壓是線性的(0~ VREF+),12位模式下DAC輸出電壓計算公式如下:
** DACx 輸出電壓 = VREF+ * ( DORx / 4095 )**DAC輸出是受DORx 寄存器直接控制的,但是不能直接往DORx 寄存器寫入數據,而是要通過DHRx間接的傳給DORx 寄存器,實現對DAC輸出的控制。如果未選擇硬件觸發,1個APB1時鐘周期后,DHRx中存儲的數據將自動轉移到DORx 寄存器;如果選擇硬件觸發,將在3個APB1時鐘周期后進行轉移
當DORx加載了DHRx內容時,模擬輸出電壓將在一端時間tSETTING后可用,具體取決于電源電壓和模擬輸出負載,可以從數據手冊查到tSETTING的典型值為3us,最大值為4us,因此DAC的轉換速度最快是250K左右
DAC可通過外部事件(定時器、外部中斷線)觸發轉換,外部觸發源列表如下示
2.硬件設計
本實驗通過D1指示燈來提示系統運行狀態,K_UP用來增加DAC輸入值,K_DOWN用來減少DAC輸入值,輸入值的改變將控制DAC_OUT1的電壓輸出,通過USART1將輸出的電壓值打印出來
* 指示燈D1
* USART1串口
* DAC_OUT1(PA4)
* K_UP和K_DOWN按鍵
3.軟件設計
3.1 STM32CubeMX設置
?? RCC設置外接HSE,時鐘設置為72M
?? PC0設置為GPIO推挽輸出模式、上拉、高速、默認輸出電平為高電平
?? USART1選擇為異步通訊方式,波特率設置為115200Bits/s,傳輸數據長度為8Bit,無奇偶校驗,1位停止位
?? PA0設置為GPIO輸入模式、下拉模式;PE3設置為GPIO輸入模式、上拉模式
?? 激活DAC_OUT1,關閉輸出緩沖,不使用觸發功能
??輸入工程名,選擇路徑(不要有中文),選擇MDK-ARM V5;勾選Generated periphera initialization as a pair of ‘.c/.h’ files per IP ;點擊GENERATE CODE,生成工程代碼
3.2 MDK-ARM軟件編程
?? 在dac.c文件中可以看到DAC初始化相關函數
void MX_DAC_Init(void){
DAC_ChannelConfTypeDef sConfig = {0};
/** DAC Initialization */
hdac.Instance = DAC;
if (HAL_DAC_Init(&hdac) != HAL_OK){
Error_Handler();
}
/** DAC channel OUT1 config */
sConfig.DAC_Trigger = DAC_TRIGGER_NONE; //不使用觸發功能
sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE; //輸出緩沖關閉
if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1) != HAL_OK){
Error_Handler();
}
}
void HAL_DAC_MspInit(DAC_HandleTypeDef* dacHandle){
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(dacHandle->Instance==DAC) {
/* DAC clock enable */
__HAL_RCC_DAC_CLK_ENABLE(); //使能DAC時鐘
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; //模擬
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
}
?? 添加按鍵驅動文件key.c 和相關頭文件key.h,參考按鍵輸入例程
?? 在main.c文件下編寫DAC測試代碼
int main(void){
/* USER CODE BEGIN 1 */
uint16_t dac_val; //讀取的DAC值
float dac_vol; //轉換后的電壓值
uint8_t t = 0;
uint16_t dac_setval = 0; //DAC設置值
uint8_t key;
/* USER CODE END 1 */
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DAC_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
HAL_DAC_Start(&hdac,DAC_CHANNEL_1); //開啟DAC通道1
HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,0);//置初始值為0
/* USER CODE END 2 */
while (1){
t++;
key = KEY_Scan(0);
if(key == KEY_UP_PRES){
if(dac_setval < 4000)
dac_setval += 200;
HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,dac_setval);
}
else if(key == KEY_DOWN_PRES){
if(dac_setval > 200)
dac_setval -= 200;
else
dac_setval = 0;
HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,dac_setval);
}
/按鍵按下了或定時時間到
if(t == 10 || key == KEY_UP_PRES || key == KEY_DOWN_PRES){ /
dac_val = HAL_DAC_GetValue(&hdac,DAC_CHANNEL_1);
printf("DAC_OUT1 DAC value: %drn",dac_val);
dac_vol = dac_val * (3.3/4096);
printf("DAC_OUT1 VOL value: %.2fVrn",dac_vol);
printf("rn");
t = 0;
}
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);
HAL_Delay(100);
}
}
4.下載驗證
圖片
編譯無誤后下載到開發板,可用看到D1指示燈不斷閃爍,同時打印出DAC通道1的DAC值和電壓值,當按下K_UP按鍵輸出電壓增大,按下K_DOWN按鍵輸出電壓減小
上一篇:玩轉STM32CubeMX | SPI總線
下一篇:玩轉STM32CubeMX | 跑馬燈
推薦閱讀
史海拾趣
GHI Electronics深知技術創新是企業持續發展的關鍵。因此,公司不斷加大研發投入,致力于開發具有自主知識產權的產品。其中,ARM微控制器、顯示模塊、空氣質量傳感器、模塊化系統以及微處理器等主打產品系列,憑借其卓越的性能和穩定的品質,在消費電子、便攜設備、通訊/網絡等領域獲得了廣泛應用。這些技術創新不僅鞏固了GHI Electronics在市場上的領先地位,也為其未來的發展奠定了堅實的基礎。
在快速發展的過程中,ACI始終注重品質管理。公司建立了嚴格的質量檢測體系,確保每一件產品都符合高標準的質量要求。同時,ACI還積極推行持續改進的理念,不斷優化生產流程,提高生產效率。
這些努力使得ACI的產品在市場上贏得了良好的口碑。客戶對公司的產品和服務給予了高度評價,紛紛表示愿意與ACI建立長期合作關系。這些正面的反饋進一步推動了ACI的發展。
隨著環保意識的日益增強,ACI積極響應國家號召,致力于綠色電子產品的研發和生產。公司投入大量資源研發環保材料和技術,推出了一系列符合環保標準的產品。
這些綠色電子產品在市場上受到了廣泛歡迎。消費者越來越關注產品的環保性能,ACI的產品正好滿足了這一需求。同時,公司的環保理念也得到了社會各界的認可和支持,進一步提升了公司的品牌形象。
隨著市場的不斷擴大,Coiltronics公司意識到單憑自身的力量難以滿足日益增長的市場需求。于是,公司開始積極尋求與其他企業的戰略合作。通過與知名電子設備制造商建立合作關系,Coiltronics成功將其線圈技術應用于更廣泛的領域,進一步提升了市場份額。同時,這種合作也帶來了雙方在技術研發、市場推廣等方面的深入交流,為公司的長遠發展奠定了堅實基礎。
Diodes Incorporated公司成立于1970年,其初衷是致力于半導體技術的研發和生產。在創立初期,公司面臨著來自行業巨頭的激烈競爭,但憑借對技術的深入理解和市場需求的敏銳洞察,Diodes Incorporated逐漸在市場中找到了自己的定位。公司專注于生產高品質、特定應用的半導體產品,逐漸在消費電子、計算機、通信等領域建立了良好的聲譽。
ABI Electronics公司深知研發實力是企業發展的核心競爭力。因此,公司不斷加大對研發的投入,引進了一批高素質的研發人才,建立了完善的研發體系。通過與高校、科研機構等合作,ABI不斷吸收新的技術和知識,推動產品的升級換代,保持了在行業內的技術領先地位。
隨著經濟體制改革的深入,在市場的推動下,數字電能表發展迅猛,中國目前已成為世界電能計量行業最具有活力的市場。隨著用戶用電負荷的增加,供電質量的要求也越來越高,供電部門需要了解電網質量和用戶的各種用電參數,如功率、電壓、電流、頻率 ...… 查看全部問答∨ |
|
我注冊了應用程序,調用usbdDynamicAttachRegister(),用USBD_NOTIFY_ALL作為參數,運行時插入攝像頭沒有反應,而插入USB鍵盤則有顯示,能正確顯示設備類型、次類型、協議等信息。這是什么原因呢? 例外我想重新編譯usb的源文件,就是target/src/u ...… 查看全部問答∨ |
|
在藍牙4.0出生之前,如果把鈕扣電池安裝在無線技術上,它只能用不到一個月。而現在,你可用一到兩年。 設想,你可以一邊跑步,一邊用藍牙耳機在MP3中聽音樂。同時,你的心率信息也可以通過這個設備自動傳 ...… 查看全部問答∨ |
視頻演示:改編德州儀器eZ430-Chronos無線運動手表為具釣魚輔助功能 這兩天發現6月份月度獎里有我,主要是因為這個帖子:我改的EZ430-Chronos無線釣魚運動手表初步功能算是按計劃都實現了因為當時只是上了張圖片,寫的也簡單,所以現在拍了個視頻,還是有點啰嗦,感興趣的湊合看看吧,也不重拍了。不多介紹一下感覺有 ...… 查看全部問答∨ |
最近在做實驗項目,做了一個出來了后,我們老師開始讓我用狀態機的方法來寫,可是我看了很多資料,還是對狀態機不是太了解,算是似懂非懂吧? 那位大蝦懂都的話,請給小弟指點一二吧!!!… 查看全部問答∨ |
replyreload += \',\' + 1624542; 本帖最后由 37°男人 于 2014-1-19 11:03 編輯 1、從下圖可以發現,rtsp是基于tcp可靠連接,而rtp是基于udp不可靠連接,所以在創建網絡socket的時候需要分別經行創建。 2、創建rtsp網絡連接sfd = socket(A ...… 查看全部問答∨ |
有用過Silicon Labs的CMEMS振蕩器嗎?性能如何啊?感覺是個新事物啊,誰吃過這個螃蟹?呵呵~ 今天深圳世強的幾個筒子到公司來推他們的振蕩器,我們智能穿戴設備用的方案其實就是世強提供的Silicon Labs的MCU(成本、功耗優勢非常突出,通用M0內核 ...… 查看全部問答∨ |
enum枚舉型可以替?#define的作用,但是在編譯一下程序的時候就出現錯誤不知道什么原因? enum KER_SWITCH { KEY1 = 0x00010, KEY2 = ...… 查看全部問答∨ |