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 | 跑马灯
推荐阅读
史海拾趣
灿科盟电子实业有限公司成立于2003年8月,注册资金100万。公司创始人凭借在电子行业多年的积累,决定创立自有品牌“CKMTW”,专注于连接器产品的研发与生产。在初创阶段,公司面临着资金紧张、市场竞争激烈等挑战,但凭借坚定的信念和不断的技术创新,逐渐在市场中站稳脚跟。
除了产品创新,Apacer宇瞻科技还注重为客户提供量身定制的解决方案。在某次客户系统升级中,宇瞻科技的技术团队发现原有SD卡无法满足大量随机小数据的存取应用,甚至可能缩短SSD使用寿命。于是,宇瞻科技建议客户导入Page Mapping技术,并搭配Smart Read Refresh技术的SD卡,成功解决了客户的存储问题。这一技术突破不仅帮助客户实现了系统升级,也为宇瞻科技赢得了更多的信任和赞誉。
在各大电子展会上,Apacer宇瞻科技也频繁亮相,展示其最新技术和产品。在某次台北世界贸易中心的展会上,宇瞻科技展示了一款高端DDR3内存,其频率高达1600MHz,带宽达到了惊人的12800MB/s。这一产品吸引了众多观众的关注,也进一步彰显了宇瞻科技在内存模组领域的领先地位。
这五个故事只是Apacer宇瞻科技发展历程中的一部分,但它们足以展现出公司从创立到崛起的艰辛与辉煌。在未来的发展中,相信宇瞻科技将继续凭借其卓越的技术实力和持续的创新精神,为电子行业的发展贡献更多力量。
为了进一步丰富产品线,APEM在1984年开设了新厂,专业生产开关面板。这一举措不仅扩充了公司的产品种类,也满足了客户对多样化产品的需求。此后,APEM不断推出新产品,逐步形成了完善的开关和控制面板产品线。
进入20世纪90年代,CTS公司迎来了重要的技术突破。随着Motorola通讯零件事业部的加入,CTS在无线通讯领域取得了显著进展,成为该领域的领先者。此外,CTS还积极投入研发,不断推出创新产品,进一步巩固了其在电子行业的地位。