STM32F103DAC输出直流、锯齿波、三角波,正弦波
一、DAC基本原则原理
二、 各波形输出及cubeMx设置
1、直流信号
cubeMx配置:
伪代码:
-
int main(void)
-
{
-
HAL_Init();
-
SystemClock_Config();
-
MX_GPIO_Init();
-
MX_DAC_Init();
-
-
HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12_R,248);//248/4096*3.3=0.2V
-
-
//开启DAC通道1
-
if(HAL_DAC_Start(&hdac,DAC_CHANNEL_1)!=HAL_OK)
-
{
-
Error_Handler();
-
}
-
}
-
-
while(1)
-
{
-
}
实测结果:(手持示波器)
2、锯齿波
cubeMx配置与上一题一致。
伪代码:
-
int main()
-
{
-
int dacValue;
-
HAL_Init();
-
SystemClock_Config();
-
MX_GPIO_Init();
-
MX_DAC_Init();
-
-
-
while(1)
-
{
-
for(dacValue=o;dacValue<20;dacValue )//循环次数和波的阶梯化相关,循环次数越多波越光滑
-
{
-
HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12_R,124*dacValue);//最高2480/4096*3.3=1V
-
-
//开启DAC通道1
-
if(HAL_DAC_Start(&hdac,DAC_CHANNEL_1)!=HAL_OK)
-
{
-
Error_Handler();
-
}
-
HAL_Delay(1);//频率和延时时间以及阶梯数有关
-
]
-
}
实测结果:(Vpp有些误差)
3、定时器2触发DAC产生三角波
型号:
Timer2在 APB1总线上
cubeMx配置:
伪代码:
-
int main()
-
{
-
-
HAL_Init();
-
SystemClock_Config();
-
MX_GPIO_Init();
-
MX_TIM2_Init();
-
HAL_TIM_Base_Start(&htim2);//在定时器厨师话函数中添加也可以
-
MX_DAC_Init();
-
-
//配置DHR12RD寄存器,对应波形的最低电压
-
if(HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,0x0)!=HAL_OK)
-
{Error_Handler();}
-
//开启DAC通道一
-
if(HAL_DAC_Start(&hdac,DAC_CHANNEL_1)!=HAL_OK)
-
{Error_Handler();}
实测结果:
因为APB1总线的频率为16Mhz,16000_000/(15 1)/(1 1)/(1023 1)=488hz,15,1,1023分别是在cubeMx中配置的预分频系数,自动装载值,三角波最大幅值,所以实测频率为488hz。
4、定时器6触发DAC转换,使用DMA方式触发产生正弦波 (APB1总线改为72Mhz)
cubeMx配置:
DAC DMA转换方式
Timer6
伪代码:
实测结果:
频率等于:72000_000/16/255/32=549hz,采了32个点,采点越多越光滑。
波表的形式要提前算好波表不太方便,第二种方法
-
#define PI 3.1415926
-
#define DAC_Num 32
-
-
void SineWave_Data(uint16_t cycle,uint16_t *D)
-
{
-
uint16_t i;
-
// 130是一个输出偏置,将输出波形都往上拉0.01v,621是限制输出波形幅度
-
for(i=0;i<cycle;i )
-
{
-
D[i]=621*(sin((2.0*PI*i)/(cycle-1)) 1) 130;
-
}
-
}
-
-
int main()
-
{
-
Uint16_t dac_data[DAC_Num ];
-
-
MX_GPIO_Init();
-
MX_DMA_Init();
-
MX_DAC_Init();
-
MX_TIM6_Init();
-
HAL_TIM_Base_Start(&htim6);//记得初始化时钟
-
-
memset(dac_data,0,sizeof(dac_data));
-
SineWave_Data(DAC_Num ,dac_data);
-
if(HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1,(uint32_t *)dac_data,dac_num[i],DAC_ALIGN_12B_R)!=HAL_OK)
-
{
-
Error_Handler();
-
}
-
}
实测结果:
(具体参数不记得了,预分频系数为0,自动装载系数为1)
这个方法可以扩展扫频,下面是我做的一个1K到40K的扫频,代码就不展出献丑了。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgcjfgf
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01