输出三角波实验简要:
1,功能描述
通过DAC1通道1(PA4)输出三角波,然后通过DS100示波器查看波形
2,关闭通道1触发(即自动)
TEN1位置0
3,关闭输出缓冲
BOFF1位置1
4,使用12位右对齐模式
将数字量写入DAC_DHR12R1寄存器
输出三角波函数
/**
* @brief 设置DAC_OUT1输出三角波
* @note 输出频率 ≈ 1000 / (dt * samples) Khz, 不过在dt较小的时候,比如小于5us时, 由于delay_us
* 本身就不准了(调用函数,计算等都需要时间,延时很小的时候,这些时间会影响到延时), 频率会偏小.
*
* @param maxval : 最大值(0 < maxval < 4096), (maxval + 1)必须大于等于samples/2
* @param dt : 每个采样点的延时时间(单位: us)
* @param samples: 采样点的个数, samples必须小于等于(maxval + 1) * 2 , 且maxval不能等于0
* @param n : 输出波形个数,0~65535
*
* @retval 无
*/
void dac_triangular_wave(uint16_t maxval, uint16_t dt, uint16_t samples, uint16_t n)
{
uint16_t i, j;
float incval; /* 递增量 */
float Curval; /* 当前值 */
if(samples > ((maxval + 1) * 2))return ; /* 数据不合法 */
incval = (maxval + 1) / (samples / 2); /* 计算递增量 */
for(j = 0; j < n; j++)
{
Curval = 0;
HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Curval); /* 先输出0 */
for(i = 0; i < (samples / 2); i++) /* 输出上升沿 */
{
Curval += incval; /* 新的输出值 */
HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Curval);
delay_us(dt);
}
for(i = 0; i < (samples / 2); i++) /* 输出下降沿 */
{
Curval -= incval; /* 新的输出值 */
HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Curval);
delay_us(dt);
}
}
}
输出正弦波函数实验简要:
1,功能描述
通过DAC1通道1(PA4)输出正弦波,然后通过DS100示波器查看波形
2,使用定时器7 TRGO事件触发转换
TEN1位置1、TSEL1[2:0]=010
3,关闭输出缓冲
BOFF1位置1
4,使用DMA模式
DMAEN1位置1
5,使用12位右对齐模式
将数字量写入DAC_DHR12R1寄存器
DAC输出正弦波实验配置步骤
1,初始化DMA
HAL_DMA_Init()
2,将DMA和ADC句柄联系起来
__HAL_LINKDMA()
3,初始化DAC
HAL_DAC_Init()
4,DAC MSP初始化
HAL_DAC_MspInit() 配置NVIC、CLOCK、GPIO等
5,配置DAC相应通道相关参数
HAL_DAC_ConfigChannel()
6,启动DAM传输
HAL_DMA_Start()
7,配置定时器溢出频率并启动
HAL_TIM_Base_Init()、 HAL_TIM_Base_Start()
8,配置定时器触发DAC转换
HAL_TIMEx_MasterConfigSynchronization()
9,停止/启动DAC转换、DMA传输
HAL_DAC_Stop_DMA()、 HAL_DAC_Start_DMA()
输出正弦波函数
uint16_t g_dac_sin_buf[4096]; /* 发送数据缓冲区 */
/**
* @brief 产生正弦波序列函数
* @note 需保证: maxval > samples/2
* @param maxval : 最大值(0 < maxval < 2048)
* @param samples: 采样点的个数
* @retval 无
*/
void dac_creat_sin_buf(uint16_t maxval, uint16_t samples)
{
uint8_t i;
float outdata = 0; /* 存放计算后的数字量 */
float inc = (2 * 3.1415962) / samples; /* 计算相邻两个点的x轴间隔 */
if(maxval <= (samples / 2))return ; /* 数据不合法 */
for (i = 0; i < samples; i++)
{
/*
* 正弦波函数解析式:y = Asin(ωx + φ)+ b
* 计算每个点的y值,将峰值放大maxval倍,并将曲线向上偏移maxval到正数区域
* 注意:DAC无法输出负电压,所以需要将曲线向上偏移一个峰值的量,让整个曲线都落在正数区域
*/
outdata = maxval * sin(inc * i) + maxval;
if (outdata > 4095)
outdata = 4095; /* 上限限定 */
//printf("%f\r\n",outdata);
g_dac_sin_buf[i] = outdata;
}
}
注意:在配置定时器触发DAC转换
HAL_TIMEx_MasterConfigSynchronization();
关键结构体
/**
* @brief TIM Master configuration Structure definition
*/
typedef struct
{
uint32_t MasterOutputTrigger; /*!< Trigger output (TRGO) selection
This parameter can be a value of @ref TIM_Master_Mode_Selection */
uint32_t MasterSlaveMode; /*!< Master/slave mode selection
This parameter can be a value of @ref TIM_Master_Slave_Mode
@note When the Master/slave mode is enabled, the effect of
an event on the trigger input (TRGI) is delayed to allow a
perfect synchronization between the current timer and its
slaves (through TRGO). It is not mandatory in case of timer
synchronization mode. */
} TIM_MasterConfigTypeDef;
其中MasterOutputTrigger为配置定时器触发输出的选择
/** @defgroup TIM_Master_Mode_Selection TIM Master Mode Selection
* @{
*/
#define TIM_TRGO_RESET 0x00000000U /*!< TIMx_EGR.UG bit is used as trigger output (TRGO) */
#define TIM_TRGO_ENABLE TIM_CR2_MMS_0 /*!< TIMx_CR1.CEN bit is used as trigger output (TRGO) */
#define TIM_TRGO_UPDATE TIM_CR2_MMS_1 /*!< Update event is used as trigger output (TRGO) */
#define TIM_TRGO_OC1 (TIM_CR2_MMS_1 | TIM_CR2_MMS_0) /*!< Capture or a compare match 1 is used as trigger output (TRGO) */
#define TIM_TRGO_OC1REF TIM_CR2_MMS_2 /*!< OC1REF signal is used as trigger output (TRGO) */
#define TIM_TRGO_OC2REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_0) /*!< OC2REF signal is used as trigger output(TRGO) */
#define TIM_TRGO_OC3REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_1) /*!< OC3REF signal is used as trigger output(TRGO) */
#define TIM_TRGO_OC4REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_1 | TIM_CR2_MMS_0) /*!< OC4REF signal is used as trigger output(TRGO) */
/**
* @}
*/
配置的相关寄存器为:
MMS[2:0]我们选择010更新,事件被选为触发输入(TRGO)。
其中MasterSlaveMode为设置主从模式,这里我们选择无作用。