53.PWM DAC实验

发布者:电子科技爱好者最新更新时间:2018-10-17 来源: eefocus关键字:PWM  DAC实验 手机看文章 扫描二维码
随时随地手机看文章

一。 PWM DAC的原理


53.PWM <wbr>DAC实验
N= ARR-1

T= 定时器一个计数周期的时间,也就是它频率的倒数。

n = CCR计数器的值

53.PWM <wbr>DAC实验

任何一个连续信号都可以把它通过傅里叶变换成有直流分量+一次谐波+二次谐波+。。。 。n次谐波(n=无穷大)这种表示。

 

53.PWM <wbr>DAC实验
我们通过定时器产生一个PWM信号,是一系列方波输出到定时器的通道引脚,我们看到公式中有一个直流分量,然后有一次谐波,二次谐波。。。。。n次谐波,如果我们有办法先把谐波这一部分给去掉,那么只剩下直流分量,直流分量中 有几个常量,Vh一般是3.3,Vl一般是0,那么这个公式就可以表示成(n/N)*Vh,如果我们设置好了自动装载值N,那么输出的电压只与n有关,n越大,输出电压越大,n=0,输出电压就是0,这里这个n就是设置占空比CCR的值,通过设置n的值改变了输出电压。这里的前提是这个信号必须把后面的谐波去掉,这里就涉及到滤波的概念,如果在后面设计一个滤波器把谐波都给滤掉,就需要设计一个低通滤波器,使频率低的信号通过,去掉频率高的信号,当然如果简单的设计一个低通滤波器不能百分之百的把一次谐波,二次谐波等滤掉,如果把1次谐波很好的滤掉,则高次谐波就应该基本不存在了,精度还是可以接受的。

53.PWM <wbr>DAC实验
分辨率的概念:

   在讲解DAC的时候知道12位的DAC有2的12次方个值也就是4096个值,0--4095.那么通过PWMDAC产生的信号的分辨率怎么确定?

f(t)= ( n/N ) *Vh,这里n确定了幅度,那么最小值是n=0,n的最大值是n最大也不能超过N,即n = N-1,也就是说直接输出一个直流信号,所以分辨率=log2(N), 比如定时器设置ARR的值是256,N= 256,那么分辨率= log2(N)就是8位。


定时器是怎么来产生PWM信号的呢?

    定时器开启之后,会从0开始往上计数,比如计数到自动装载值ARR-1,比如99,从0计数到99后又会从0计数到99,这样一个过程,或者向下计数,都是一样的,向下计数就是从自动装载值往下计数到0,然后又从装载值往下计数到0,这个过程。

     怎么通过定时器产生PWM呢?还有一个输出比较寄存器CCR,定时器的控制器会把计数器中的值跟CCR中的值进行比较,比如我们设置了模式等相关参数后,当计数器的值比CCR中的值小的时候输出通道引脚输出高电平,当计数器计数到CCR后再往上计数,这个值大于CCR中的值,输出电平。到ARR-1后又从0开始往上计数,又比CCR小,所以又输出高电平,这样一直循环就产生了一个PWM波。

   所以STM32定时器产生PWM波,它的周期是由ARR决定的,占空比由CCR来决定。

二。PWM DAC硬件连接

53.PWM <wbr>DAC实验
1. 需要设计一个滤波器,这里设计的二阶滤波,计算出滤波器的截止频率。

2. 我们用PA8,也就是定时器PA8(定时器一的通道1)产生PWM,最好PWM通过低通滤波转换成为一个直流信号。

PA8经过滤波器连到PDC ,我们把PDC和ADC连到一起。

53.PWM <wbr>DAC实验

这样可以通过DAC输出信号,然后通过ADC进行测量。

三。 代码讲解

1. timer.c

//TIM1 CH1 PWM输出设置 

//PWM输出初始化

//arr:自动重装值

//psc:时钟预分频数

void TIM1_PWM_Init(u16 arr,u16 psc)

{  

 

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

TIM_OCInitTypeDef  TIM_OCInitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //使能定时器1TIMx外设

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA外设时钟使能

 

  //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM1_CH1

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //设置PA8为复用功能输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIO

 

TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载周期值

TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值 不分频

TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx

 

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //CH1 PWM2模式

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //OC1 低电平有效 

TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据指定的参数初始化外设TIMx,初始化输出比较通道1

TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1 预装载使能

TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器

TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主输出使能,高级定时器必须开启这个 

TIM_Cmd(TIM1, ENABLE);  //使能TIMx

   

2,main.c

//设置输出电压

//vol:0~330,代表0~3.3V

void PWM_DAC_Set(u16 vol)

{

float temp=vol;

temp/=100;

temp=temp*256/3.3;

TIM_SetCompare1(TIM1,temp);

}

 int main(void)

 {  

u16 adcx;

float temp;

  u8 t=0;  

u16 pwmval=0;

u8 key;

delay_init();     //延时函数初始化  

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

uart_init(115200); //串口初始化为115200

KEY_Init();  //KEY初始化

  LED_Init();     //LED端口初始化

usmart_dev.init(72); //初始化USMART

LCD_Init(); //LCD初始化

  Adc_Init();   //ADC初始化

TIM1_PWM_Init(255,0); //TIM1 PWM初始化, Fpwm=72M/256=281.25Khz.ARR= 255,所以分辨率是8位


  TIM_SetCompare1(TIM1,100);//初始值为0,设置比较器CCR的值,达到设置PWM占空比的目的

    

  POINT_COLOR=RED;//设置字体为红色 

LCD_ShowString(60,50,200,16,16,"WarShip STM32");

LCD_ShowString(60,70,200,16,16,"PWM DAC TEST");

LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");

LCD_ShowString(60,110,200,16,16,"2015/1/15");

LCD_ShowString(60,130,200,16,16,"WK_UP:+  KEY1:-");

//显示提示信息      

POINT_COLOR=BLUE;//设置字体为蓝色

LCD_ShowString(60,150,200,16,16,"PWM VAL:");      

LCD_ShowString(60,170,200,16,16,"DAC VOL:0.000V");      

LCD_ShowString(60,190,200,16,16,"ADC VOL:0.000V");

TIM_SetCompare1(TIM1,pwmval);//初始值          

while(1)

{

t++;

key=KEY_Scan(0);  

if(key==WKUP_PRES)

{  

if(pwmval<250)pwmval+=10;

TIM_SetCompare1(TIM1,pwmval); //输出

}else if(key==KEY1_PRES)

{

if(pwmval>10)pwmval-=10;

else pwmval=0;

TIM_SetCompare1(TIM1,pwmval); //输出

}  

if(t==10||key==KEY1_PRES||key==WKUP_PRES) //WKUP/KEY1按下了,或者定时时间到了

{  

adcx=TIM_GetCapture1(TIM1);  //读回设置的CCR的值

LCD_ShowxNum(124,150,adcx,4,16,0);     //显示DAC寄存器值

temp=(float)adcx*(3.3/256); //得到DAC电压值

adcx=temp;

  LCD_ShowxNum(124,170,temp,1,16,0);     //显示电压值整数部分

  temp-=adcx;

temp*=1000;

LCD_ShowxNum(140,170,temp,3,16,0x80); //显示电压值的小数部分

  adcx=Get_Adc_Average(ADC_Channel_1,20);   //得到ADC转换值,用ADC去测量通道1的值 

temp=(float)adcx*(3.3/4096); //得到ADC电压值

adcx=temp;

  LCD_ShowxNum(124,190,temp,1,16,0);     //显示电压值整数部分

  temp-=adcx;

temp*=1000;

LCD_ShowxNum(140,190,temp,3,16,0x80); //显示电压值的小数部分

t=0;

LED0=!LED0;   

}    

delay_ms(10);

}

 }

53.PWM <wbr>DAC实验

这里V2版和V3版有所不同,V2版用的是定时器4的通道1输出PWM,所以程序不同。


关键字:PWM  DAC实验 引用地址:53.PWM DAC实验

上一篇:54。I2C通信实验
下一篇:52. STM32的DAC实验

推荐阅读最新更新时间:2024-03-16 16:16

如何实现高精度高稳定性的DA输出
在实际应用中,很多时候需要输出电压,电流等信号,特别是在工控行业中,4-20mA的转换经常要用到,如果采用AD421芯片来做的话,可以轻易实现一个16位的DA输出电路,但是成本颇高,在很多的项目中用不上如此昂贵的芯片。   既然现在很多的仪表中都使用了单片机,为何不用单片机的PWM输出来做一个DA呢?   实践表明,这样完全可行,PWM可以通过定时器来产生,然后经过一个转换电路,可以实现一个隔离的DA输出。   后页是该电路:   该电路来源于实际应用!用该电路做隔离的4-20mA或者是1-5V的变换电路,可以达到0.5‰的精度以下,同时成本很低。   PWM经过光耦隔离后,由于波形可能发生畸变,所以,经过一个门电路来整形。然后经
[单片机]
如何实现高精度高稳定性的DA输出
无传感器、无电刷的电动机控制设计实现
技术不断在向前迈进,新出品的电子元件简化了电动和控制器的设计,对於工程师开发电器用具设计并从无电刷电动机操作上得著莫大的好处是担当一个重要角色。   无电刷电动机(Brushless Motor)的应用设计越来越多都是传统上依赖DC和异步电动机。主要的好处一般包括无电刷电动机的单位成本和能以电子方式控制速度和转距,这不单节省机械设计,而且还使到在家用电器、电风扇、压缩器及工业传动机器上达至节能目的,传统的做法是在关闭与全速的浪费操作之间交替地进行。   无电刷电动机控制算法(control algorithm)需要转子位置数据来计算脉宽调制(PWM)输出,但是采用比如霍尔效应(Hall Effect)器件之类传感器来检测转子
[工业控制]
stm32的PWM输入捕获模式
一、概念理解 PWM输入捕获模式是输入捕获模式的特例,自己理解如下 1. 每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。且IC1 IC2一组,IC3 IC4一组。并且可是设置管脚和寄存器的对应关系。 2. 同一个TIx输入映射了两个ICx信号。 3. 这两个ICx信号分别在相反的极性边沿有效。 4. 两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式。 5. 当触发信号来临时,被设置成触发输入信号的捕获寄存器,捕获 一个PWM周期(即连续的两个上升沿或下降沿) ,它等于包含TIM时钟周期的个数(即捕获寄存器中捕获的为TIM的计数个数n)。 6. 同样另一个捕获通道捕获触发信号和下一个相反极
[单片机]
MSP432的PWM功能实现
PWM基本概念 脉冲宽度调制器PWM工作原理 PWM产生一个在高电平和低电平之间重复交替的输出信号,这个信号被称为PWM信号,也叫脉宽调制波。通过制定所需的时钟周期和占空比来控制高电平和低电平的持续时间。 PWM控制技术·引言 PWM(Pulse Width Modulation)控制就是脉宽调制技术:即通过对一系列脉冲的宽度进行调制,来等效的获得所需要波形(含形状和幅值)。 PWM控制的思想源于通信技术,全控型器件的发展使得实现PWM控制变得十分容易。 PWM技术的应用十分广泛,它使电力电子装置的性能大大提高,因此它在电力电子技术的发展史上占有十分重要的地位。 PWM控制技术正是有依赖于在逆变电路中的成功应用,才确定了它在电
[单片机]
MSP432的<font color='red'>PWM</font>功能实现
STM32 TIM1的PWM没有输出
设置了TIM1的CHN1及CHN4输出PWM,代码如下,但是仿真的波形不对,上设备也不正确: RCC- APB2ENR|=1 11; //TIM1时钟使能 RCC- APB2ENR|=1 2; //使能PORTA时钟 GPIOA- CRH&=0XFFFFFFF0;//PA8输出 GPIOA- CRH|=0X0000000B;//通用推挽输出 GPIOA- ODR|=1 8;//PA8上拉 GPIOA- CRH&=0XFFFF0FFF;//PA11输出 GPIOA- CRH|=0X0000B000;//通用推挽输出 GPIOA- ODR|=1 11;//PA11上拉
[单片机]
2. avr定时器/计数器0 --TC0 --快速PWM输出
PWM:脉冲宽度调制,图中T为脉冲周期,t为高电平时间,t与T的比值t/T称为占空比,脉宽调制指的是调整t的大小,即改变脉冲的占空比 ,占空比值越大,输出的电压越高。改变占空比就改变输出的电压,常用于实现D/A,调节电压或电流,改变电动机的转速等。 快速PWM模式:它的计数方式是TCNT0由0开始计数到255式,计数加1返回到0,然后继续加1计数,相对于相位PWM修正模式(由0计数到255,再从255计数到0),只有一个斜坡,因此PWM输出频率高。在快速PWM模式下,计数器的最大值决定了PWM的频率,而比较寄存器OCR0决定了占空比的大小。T/C0是8位计数器, 输出PWM的频率=系统时钟频率/(分频系数*255) 。 P
[单片机]
交流跳周模式如何提高PFC轻负载的效率?
对于输入功率大于或等于75瓦的电源来说,通常需要使用功率因数校正 (PFC)。功率因数校正可强制输入电流随输入电压的变化而发生变化,这样的话,任何电气负载对于为其供电的电压源来说都表现为一个电阻。这一点对于很多服务器、电信和工业应用是必须满足的要求。在这些应用中,对于能效和电能质量的要求已经变得越来越严格。评判PFC性能的最重要标准是效率,总谐波失真 (THD),和功率因数 (PF)。借助于全新半导体器件和控制方法,最新式的PFC电路已经在中度和重度负载情况下实现了极佳性能。然而,在轻负载条件下,效率,THD和PF性能严重降低。   图表1中显示的是一个典型PFC效率曲线。需要注意的是,轻负载时效率变得越来越低。这是
[嵌入式]
Buck-Boost PWM DC/DC转换器的级联
  利用三种最基本的PWM转换器,除了可以利用演化的方式派生出新的转换器之外,利用级联方式也可以派生出新的转换器。   将两个Buck-Boost电路组合后,可以得到单开关Buck-Boost级联,其演化过程如图所示。   其中,演化过程需要注意的是,第二级在如图(b)中的极性反转,以对应前级输出极性:在如图(c)中,第二级回路中加人一个二极管砀,以阻止与第一级连接后,在开关管V关断期间第一级电流窜人第二级。将如图(e)第一级与第二级中的开关管V,电容C重合,得到如图(d)所示的电路,其输出黼入关系为如图 Buck-Boost与Buck级联的演化过程。   如图 Buck-Boost与Buc
[电源管理]
Buck-Boost <font color='red'>PWM</font> DC/DC转换器的级联
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved