STM32实验-PWM DAC模拟输出

这篇具有很好参考价值的文章主要介绍了STM32实验-PWM DAC模拟输出。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一般一个STM32只有2个DAC输出通道,如果需要多路DAC输出,可以选择外扩DAC,但成本回相当高。于是在一些精度要求不高的场合,我们采用定时器输出PWM和RC滤波器模拟DAC来代替外扩DAC。

PWM占空比可由以下式子计算出:p = n / N (n是on的时间,即带宽,N是周期)

PWM周期是由ARR决定的,PWM占空比是由CCRx决定。ARR是自动重装载寄存器的数值,即定时器的锯齿波的最大值,CCRx是捕获/比较寄存器x的数值,是进行比较器comparator的正极电压。

于是我们知道,DAC输出电压为 = DORx / 4096 * Vref。对于分辨率 = log2 (N),比如N = 256,分辨率为8位。因为定时器的时钟频率往往更高,所以更容易获得更高的分辨率。本实验也以8位为例。

本实验的要求如下:要求一次谐波对输出电压影响不要超过一个位的精度,也就是3.3 / 256 = 0.01289V。假设Vh为3.3V,Vl为0V,这里的一次谐波的最大值为2 * 3.3 / pi = 2.1V。RC滤波电路要求是提供至少 -20lg(2.0 / 0.01289) = -44dB的衰减。截止频率要求为当定时器计数频率为72MHz,PWM DAC频率为8位时,PWM频率为72M / 256 = 281.25kHz,如果是一阶RC滤波,则要求截止频率为1.77kHz,如果是二阶RC滤波,则要求截止频率为22.34kHz。

对二阶RC滤波器来说,频率计算公式为f = (1 / (2 * pi)) *RC

接下来我们编写实验代码:

首先我们编写函数代码dac_pwm.c:

#include "dac_pwm.h"
#include "./BSP/TIMER/gtim.h"

TIM_HandleTypeDef g_timx_pwm_chy_handle;

void dac_pwm_init(uint16_t arr, uint16_t psc){

    TIM_OC_InitTypeDef timx_oc_pwm_chy;
 
    g_timx_pwm_chy_handle.Instance = TIM1;
    g_timx_pwm_chy_handel.Init.Prescaler = psc;
    g_timx_pwm_chy_handle.Init.Period = arr;
    g_timx_pwm_chy_handle.Init.CounterMode = TIM_COUNTERMODE_UP;//向上计数模式
    g_timx_pwm_chy_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
    HAL_TIM_PWM_Init(&g_timx_pwm_chy_handle);
 
    timx_oc_pwm_chy.OCMode = TIM_OCMODE_PWM1;//选择PWM1模式
    timx_oc_pwm_chy.Pulse = 0;//设置占空比的比较值
    timx_oc_pwm_chy.OCPolarity = TIM_OCPOLARITY_HIGH;//输出极性:低极性
    HAL_TIM_PWM_ConfigChannel(&g_timx_pwm_chy_handle, &timx_oc_pwm_chy, TIM_CHANNEL_1);
 
    HAL_TIM_PWM_Start(&g_timx_pwm_chy_handle, TIM_CHANNEL_1);

}

void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim){
    if(htim->Instance == TIM1){
        GPIO_InitTypeDef gpio_init_struct;
        __HAL_RCC_GPIOA_CLK_ENABLE();
        __HAL_RCC_TIM1_CLK_ENABLE();
 
        
        gpio_init_struct.Pin = GPIO_PIN_8;
        gpio_init_struct.Mode = GPIO_MODE_AF_PP;
        gpio_init_struct.Pull = GPIO_PULLUP;
        gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOA, &gpio_init_struct);
 
        __HAL_RCC_AFIO_CLK_ENABLE();
        __HAL_AFIO_REMAP_TIM3_PARTIAL();
    }
}

void dac_pwm_set_voltage(uint16_t vol){

    float temp = vol;
    temp /= 1000;
    temp = temp * 256 / 3.3;

    __HAL_TIM_SET_COMPARE(& timx_pwm_chy_handle, TIM_CHANNEL_1, temp);
}

接下来再编写函数头文件dac_pwm.h:

#ifndef __DAC_PWM_H
#define __DAC_PWM_H
 
#include "./SYSTEM/sys/sys.h"
 
extern TIM_HandleTypeDef g_timx_pwm_chy_handle;

void dac_pwm_init(uint16_t arr, uint16_t psc);
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim);
void dac_pwm_set_voltage(uint16_t vol);
 
#endif

最后编写主函数代码main.c:

#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/GTIM/gtim.h"
#include "./BSP/DAC/dac_pwm.h"
 
int main(void){
    uint16_t adcx = 0;
    float temp = 0;
    uint16_t t = 0;

    HAL_Init();
    sys_stm32_clock_init(RCC_PLL_MUL9);
    delay_init(72);
    led_init();
    lcd_init();
    dac_init();
    adc_init();
    dac_pwm_init(256 - 1, 0);

    dac_pwm_set_voltage(3300);
    lcd_show_string(30,  50, 200, 16, 16, "STM32F103", RED);
    lcd_show_string(30,  70, 200, 16, 16, "DAC TEST", RED);
    lcd_show_string(30,  90, 200, 16, 16, "ATOM@ALIENTEK", RED);
    lcd_show_string(30, 110, 200, 16, 16, "WK_UP:+  KEY1:-", RED);

    while (1)
    {
        adcx = adc_get_result();
        lcd_show_xnum(134, 110, adcx, 5, 16, 0, BLUE);

        temp = (float)adcx * (3.3 / 4096);
        adcx = temp;
        lcd_show_xnum(134, 130, adcx, 1, 16, 0, BLUE);

        temp -= adcx;
        temp *= 1000;
        lcd_show_xnum(150, 110, temp, 3, 16, 0x80, BLUE);

        LED0_TOGGLE();  /* LED0闪烁 */
        delay_ms(100);
    }
}

到这里我们的实验代码就编写完毕了。文章来源地址https://www.toymoban.com/news/detail-477350.html

到了这里,关于STM32实验-PWM DAC模拟输出的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32定时器输出pwm&IO口模拟pwm——呼吸灯

    什么是pwm波?pwm就是脉冲宽度调制,就是占空比可变的脉冲波形,通过改变占空比,输出不同的pwm波,就能实现许多有趣的功能,比如说我们生活中常见的呼吸灯就是通过这样实现的。接下来我们就以呼吸灯为例,学习stm32通过定时器输出pwm波和io口模拟输出pwm波。 控制方式就

    2024年01月18日
    浏览(50)
  • STM32一个定时器同时配置编码器和PWM输出时PWM无法正常输出的原因【避坑】

             最近我在做写代码的时候,因为定时器的资源紧张,就在一个定时器上同时配置了编码器和PWM,发现PWM无法正常输出,查了很久发现网上资料不多,在仔细翻阅手册研究后才发现是 时钟信号 的问题。 具体原因 定时器在设置编码器模式后,计数的时钟源就会变成编

    2024年02月04日
    浏览(52)
  • 【stm32】DAC输出三角波锯齿波

    导入DAC.ioc(见上节DAC学习笔记) CubeMX图形化配置 DAC配置 实现0.1ms定时周期 时钟树配置 程序编写 实现效果 采用CubeMonitor监测生成波形 也可用示波器检测波形生成结果 在此处更改配置 使用DMA触发任意波形 若要调整锯齿波的周期,修改TIM6的分频系数和计数周期即可 程序编写

    2024年02月22日
    浏览(38)
  • 【正点原子STM32连载】第二十一章 高级定时器输出指定个数PWM实验 摘自【正点原子】APM32E103最小系统板使用指南

    1)实验平台:正点原子APM32E103最小系统板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban 本章将介绍使用APM32E103高级定时器输出指定个数的PWM。通过本章的学习,读者将学习到高级定时器重

    2024年02月21日
    浏览(58)
  • 【STM32+HAL】DAC+DMA输出波形实现

    有关CUBEMX的初始化配置,参见我的另一篇blog:【STM32+HAL】CUBEMX初始化配置 1、芯片: STM32F407ZGT6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、STM32F4xxHAL库 1、DAC+DMA输出波形 2、按键切换波形及频率 3、串口打印当前波形以及频率值 1、开启DAC 这里开启的是通道一 Output Buffer:关闭后可

    2024年02月02日
    浏览(47)
  • STM32 通过PWM输出一个方波并通过定时器输入捕获模式测量方波的周期(cubeMX+keil配置)

    前言:本文章用cubeMX和keil来进行代码编写,实现STM32的相应功能 本文章使用的STM32核心板是STM32H743VIT6,如果使用的是其他的核心板操作过程类似,可以尝试使用此教程。 (1)首先点击左侧的Timers  (2)选择一个定时器配置PWM 我选择的是TIM5,如上图 点击TIM5 Mode的配置如下

    2024年02月19日
    浏览(52)
  • STM32——DAC数模转换实验

    一、数模转换原理 STM32的DAC模块是十二位数字输入,电压输出型的DAC,DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐或者右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立的

    2024年02月05日
    浏览(40)
  • STM32CubeMX教程17 DAC - 输出三角波噪声波

    正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 野火DAP仿真器 XCOM V2.6串口助手 一台示波器 使用STM32CubeMX软件配置STM32F407开发板的 DAC OUT1实现输出三角波 STM32F407的DAC输出引脚除可以输出 DACoutput = VREF+ * DOR / 4095 的模拟电压之外

    2024年01月18日
    浏览(40)
  • STM32F103RC—DAC输出正弦波

    1.RCC SYS配置      2.开通DAC的DAM 定时器2控制 3.打开定时器    4.时钟配置  5.单片机最大时钟频率72MHZ 利用工具箱生成正弦波码表(我用的是72个点)  在while(1)前的begin和end之间添加如下两行代码:  上面两段代码: 第一句:打开定时器二 第二句:利用DAC输出正弦波函数 6

    2024年02月10日
    浏览(36)
  • STM32CubeMX教程18 DAC - DMA输出自定义波形

    开发板(正点原子stm32f407探索者开发板V2.4) STM32CubeMX软件(Version 6.10.0) 野火DAP仿真器 keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 一台示波器 逻辑分析仪nanoDLA 使用STM32CubeMX软件配置STM32F407开发板的 DAC OUT1实现输出0-3.3V 周期为12.8ms的正弦波形 由于STM32F407的两个DAC输出通道只能自动

    2024年01月19日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包