一、工具1、硬件:STM32L053R8單片機(jī)(HAL庫) 2、編譯環(huán)境:Atollic TrueSTUDIO for STM32 9.3.0 3、輔助工具:STM32CubeMX 二、DAC輸出三角波解讀為了便于解讀和查看,我這里是從STM32F4的用戶手冊中截圖的DAC生成三角波的功能介紹,介紹的文字很少,但每句話都很重要,同時我還圈出來幾個地方作以標(biāo)記。 這里我僅對標(biāo)記的地方做一些解讀。
三、單片機(jī)系統(tǒng)時鐘配置使用的是內(nèi)部MSI時鐘源作為時鐘(沒有展示的部分默認(rèn)配置)。 四、單片機(jī)DAC配置 要想使用DAC輸出三角波需要使用外部觸發(fā)源(至于原因上面有介紹),硬件不同觸發(fā)源可能會不同,這里我選擇定時器6作為觸發(fā)源。下圖中的第3步的最后一行是設(shè)置DAC輸出的三角波的MAMPx值,滿值是4095對應(yīng)3.3V電壓。第2步的外部觸發(fā)不用勾選。 五、單片機(jī)DAC觸發(fā)源定時器6配置定時器的周期可以決定DAC輸出三角波的頻率,周期越短頻率越高。 六、生成代碼并進(jìn)行完善自動生成的代碼DAC初始化完成后并沒有開啟,需要自己手動添加代碼開啟DAC功能。與此同時,在開啟DAC后還需要設(shè)置一下DAC輸出的三角波的基準(zhǔn)電壓(我這里設(shè)置基準(zhǔn)電壓值為0)。 /** * @brief DAC Initialization Function * @param None * @retval None */ static void MX_DAC_Init(void) { /* USER CODE BEGIN DAC_Init 0 */ /* USER CODE END DAC_Init 0 */ DAC_ChannelConfTypeDef sConfig = {0}; /* USER CODE BEGIN DAC_Init 1 */ /* USER CODE END DAC_Init 1 */ /** DAC Initialization */ hdac.Instance = DAC; if (HAL_DAC_Init(&hdac) != HAL_OK) { Error_Handler(); } /** DAC channel OUT1 config */ sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO; /* 定時器每個周期結(jié)束就會使DAC的值加1,最高幅值為2047,輸出三角波的周期為0.5ms*2047*2≈2s */ sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE; if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1) != HAL_OK) { Error_Handler(); } /** Configure Triangle wave generation on DAC OUT1 */ if (HAL_DACEx_TriangleWaveGenerate(&hdac, DAC_CHANNEL_1, DAC_TRIANGLEAMPLITUDE_2047) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN DAC_Init 2 */ HAL_DAC_Start(&hdac, DAC_CHANNEL_1); HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0); /* USER CODE END DAC_Init 2 */ } 同樣的定時器初始化完成后也需要自己手動添加啟動代碼。 /** * @brief TIM6 Initialization Function * @param None * @retval None */ static void MX_TIM6_Init(void) { /* USER CODE BEGIN TIM6_Init 0 */ /* USER CODE END TIM6_Init 0 */ TIM_MasterConfigTypeDef sMasterConfig = {0}; /* USER CODE BEGIN TIM6_Init 1 */ /* USER CODE END TIM6_Init 1 */ htim6.Instance = TIM6; htim6.Init.Prescaler = 0; htim6.Init.CounterMode = TIM_COUNTERMODE_UP; htim6.Init.Period = 1023; /* 可以改變?nèi)遣ǖ念l率 APB1總線時鐘是2.097MHz, 定時器的周期為(1023+1)/2.097 ≈ 0.5ms */ htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim6) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM6_Init 2 */ HAL_TIM_Base_Start(&htim6); /* USER CODE END TIM6_Init 2 */ } 完善以上兩處地方后,編譯沒問題就可以下載到單片機(jī)上,通過示波器即可觀察到三角波的輸出。 #endif |
|