本帖最后由 李冬 于 2022-3-9 08:22 編輯
因本人看不懂STM32代碼。下載別人的代碼,想知道輸出的兩種正弦波波形的頻率分別是多少
#define tableSize 33
//正弦波波形數據
//波形數據
//uint32_t sinTable[tableSize] = {1024, 1217, 1404, 1577, 1730, 1858, 1955, 2019, 2046, 2037, 1991, 1910, 1797, 1656, 1493, 1312, 1121, 927, 736, 555, 392, 251, 138, 57, 11, 2, 29, 93, 190, 318, 471, 644, 831};
uint32_t sinTable[tableSize] = {1536, 1729, 1916, 2089, 2242, 2370, 2467, 2531, 2558, 2549, 2503, 2422, 2309, 2168, 2005, 1824, 1633, 1439, 1248, 1067, 904, 763, 650, 569, 523, 514, 541, 605, 702, 830, 983, 1156, 1343};
//輸出正弦波,定時調用
void RESCHECK_PutSin(void)
{
//輸出當前位置的正弦波參數
//LL_DAC_ConvertData12RightAligned(DAC2, LL_DAC_CHANNEL_1, sinTable[sin_wave_pos]);
//LL_DAC_ConvertData12RightAligned(DAC2, LL_DAC_CHANNEL_1, 0);
DAC2->DHR12R1 = sinTable[sin_wave_pos];
//正弦波位置+1
++sin_wave_pos;
//如果sin_wave_pos>=tableSize,則sin_wave_pos=0
if(sin_wave_pos >= tableSize){
sin_wave_pos = 0;
}
}
static void MX_DAC2_Init(void)
{
/* USER CODE BEGIN DAC2_Init 0 */
/* USER CODE END DAC2_Init 0 */
LL_DAC_InitTypeDef DAC_InitStruct = {0};
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
/* Peripheral clock enable */
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_DAC2);
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA);
/**DAC2 GPIO Configuration
PA6 ------> DAC2_OUT1
*/
GPIO_InitStruct.Pin = LL_GPIO_PIN_6;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* DAC2 DMA Init */
/* DAC2_CH1 Init */
LL_DMA_SetPeriphRequest(DMA1, LL_DMA_CHANNEL_1, LL_DMAMUX_REQ_DAC2_CH1);
LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_1, LL_DMA_DIRECTION_MEMORY_TO_PERIPH);
LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_LOW);
LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MODE_CIRCULAR);
LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PERIPH_NOINCREMENT);
LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MEMORY_INCREMENT);
LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PDATAALIGN_WORD);
LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MDATAALIGN_WORD);
/* USER CODE BEGIN DAC2_Init 1 */
/* USER CODE END DAC2_Init 1 */
/** DAC channel OUT1 config
*/
LL_DAC_SetSignedFormat(DAC2, LL_DAC_CHANNEL_1, LL_DAC_SIGNED_FORMAT_DISABLE);
DAC_InitStruct.TriggerSource = LL_DAC_TRIG_EXT_TIM6_TRGO;
DAC_InitStruct.TriggerSource2 = LL_DAC_TRIG_SOFTWARE;
DAC_InitStruct.WaveAutoGeneration = LL_DAC_WAVE_AUTO_GENERATION_NONE;
DAC_InitStruct.OutputBuffer = LL_DAC_OUTPUT_BUFFER_DISABLE;
DAC_InitStruct.OutputConnection = LL_DAC_OUTPUT_CONNECT_GPIO;
DAC_InitStruct.OutputMode = LL_DAC_OUTPUT_MODE_NORMAL;
LL_DAC_Init(DAC2, LL_DAC_CHANNEL_1, &DAC_InitStruct);
LL_DAC_EnableTrigger(DAC2, LL_DAC_CHANNEL_1);
LL_DAC_DisableDMADoubleDataMode(DAC2, LL_DAC_CHANNEL_1);
/* USER CODE BEGIN DAC2_Init 2 */
/* USER CODE END DAC2_Init 2 */
}
static void MX_TIM6_Init(void)
{
/* USER CODE BEGIN TIM6_Init 0 */
/* USER CODE END TIM6_Init 0 */
LL_TIM_InitTypeDef TIM_InitStruct = {0};
/* Peripheral clock enable */
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM6);
/* USER CODE BEGIN TIM6_Init 1 */
/* USER CODE END TIM6_Init 1 */
TIM_InitStruct.Prescaler = 84;
TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
TIM_InitStruct.Autoreload = 1;
LL_TIM_Init(TIM6, &TIM_InitStruct);
LL_TIM_EnableARRPreload(TIM6);
LL_TIM_SetTriggerOutput(TIM6, LL_TIM_TRGO_UPDATE);
LL_TIM_DisableMasterSlaveMode(TIM6);
/* USER CODE BEGIN TIM6_Init 2 */
/* USER CODE END TIM6_Init 2 */
}
//==================啟動正弦波發生器==================
//配置DMA
//關閉DMA
LL_DMA_DisableChannel(DMA1,LL_DMA_CHANNEL_1);
//設置DMA傳輸的設備地址
LL_DMA_SetPeriphAddress(DMA1,
LL_DMA_CHANNEL_1,
LL_DAC_DMA_GetRegAddr(DAC2,LL_DAC_CHANNEL_1,LL_DAC_DMA_REG_DATA_12BITS_RIGHT_ALIGNED));
//設置DMA傳輸的內存地址
LL_DMA_SetMemoryAddress(DMA1,LL_DMA_CHANNEL_1,(uint32_t)&sinTable);
//設置DMA傳輸的數據長度
LL_DMA_SetDataLength(DMA1,LL_DMA_CHANNEL_1,tableSize);
//使能DMA
LL_DMA_EnableChannel(DMA1,LL_DMA_CHANNEL_1);
//使能DAC的DMA請求
LL_DAC_EnableDMAReq(DAC2, LL_DAC_CHANNEL_1);
//使能DAC
LL_DAC_Enable(DAC2, LL_DAC_CHANNEL_1);
//TIM6計數使能
LL_TIM_EnableCounter(TIM6);
}
|