你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 3984|回复: 0

【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第二十五章 PWM DAC实验

[复制链接]

50

主题

7

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2013-3-13 21:26:43 | 显示全部楼层 |阅读模式


上一章,我们介绍了STM32自带DAC模块的使用,但不是每个STM32都有DAC模块的,对于那些没有DAC模块的芯片,我们可以通过PWM+RC滤波来实一个PWM DAC。本章我们将向大家介绍如何使用STM32的PWM来设计一个DAC。我们将使用按键(或USMART)控制STM32的PWM输出,从而控制PWM DAC的输出电压,通过ADC1的通道1采集PWM DAC的输出电压,并在LCD模块上面显示ADC获取到的电压值以及PWM DAC的设定输出电压值等信息。本章将分为如下几个部分:
25.1 PWM DAC简介
25.2 硬件设计
25.3 软件设计
25.4 下载验证

25.1 PWM DAC简介
虽然大容量的STM32F103具有内部DAC,但是更多的型号是没有DAC的,不过STM32所有的芯片都有PWM输出,因此,我们可以用PWM+简单的RC滤波来实现DAC输出,从而节省成本。
PWM本质上其实就是是一种周期一定,而高低电平占空比可调的方波。实际电路的典型PWM波形,如图25.1.1所示:

图25.1.1 实际电路典型PWM波形

       图25.1.1的PWM波形可以用分段函数表示为式①:

       其中:T是单片机中计数脉冲的基本周期,也就是STM32定时器的计数频率的倒数。N是PWM波一个周期的计数脉冲个数,也就是STM32的ARR-1的值。n是PWM波一个周期中高电平的计数脉冲个数,也就是STM32的CCRx的值。VH和VL分别是PWM波的高低电平电压值,k为谐波次数,t为时间。我们将①式展开成傅里叶级数,得到公式②:
从②式可以看出,式中第1个方括弧为直流分量,第2项为1次谐波分量,第3项为大于1次的高次谐波分量。式②中的直流分量与n成线性关系,并随着n从0到N,直流分量从VL到VL+VH之间变化。这正是电压输出的DAC所需要的。因此,如果能把式②中除直流分量外的谐波过滤掉,则可以得到从PWM波到电压输出DAC的转换,即:PWM波可以通过一个低通滤波器进行解调。式②中的第2项的幅度和相角与n有关,频率为1/(NT),其实就是PWM的输出频率。该频率是设计低通滤波器的依据。如果能把1次谐波很好过滤
掉,则高次谐波就应该基本不存在了。
       通过上面的了解,我们可以得到PWM DAC的分辨率,计算公式如下:
分辨率=log2(N)

       这里假设n的最小变化为1,当N=256的时候,分辨率就是8位。而STM32的定时器都是16位的,可以很容易得到更高的分辨率,分辨率越高,速度就越慢。不过我们在本章要设计的DAC分辨率为8位。
       在8位分辨条件下,我们一般要求1次谐波对输出电压的影响不要超过1个位的精度,也就是3.3/256=0.01289V。假设VH为3.3V,VL为0V,那么一次谐波的最大值是2*3.3/π=2.1V,这就要求我们的RC滤波电路提供至少-20lg(2.1/0.01289)=-44dB的衰减。
       STM32的定时器最快的计数频率是72Mhz,8为分辨率的时候,PWM频率为72M/256=281.25Khz。如果是1阶RC滤波,则要求截止频率为1.77Khz,如果为2阶RC滤波,则要求截止频率为22.34Khz。
战舰STM32开发板的PWM DAC输出采用二阶RC滤波,该部分原理图如图25.1.2所示:
图25.1.2 PWM DAC二阶RC滤波原理图

       二阶RC滤波截止频率计算公式为:
f=1/2πRC

       以上公式要求R28*C37=R29*C38=RC。根据这个公式,我们计算出图25.1.2的截止频率为:33.8Khz超过了22.34Khz,这个和我们前面提到的要求有点出入,原因是该电路我们还需要用作PWM DAC音频输出,而音频信号带宽是22.05Khz,为了让音频信号能够通过该低通滤波,同时为了标准化参数选取,所以确定了这样的参数。实测精度在0.5LSB以内。
       PWM DAC的原理部分,就为大家介绍到这里。
 
25.2硬件设计
本章用到的硬件资源有:
1)  指示灯DS0
2)  WK_UP和KEY1按键
3)  串口
4)  TFTLCD模块
5)  ADC
6)  PWM DAC
本章,我们使用STM32的TIM4_CH1(PB6)输出PWM,经过二阶RC滤波后,转换为直流输出,实现PWM DAC。同上一章一样,我们通过ADC1的通道1(PA1)读取PWM DAC的输出,并在LCD模块上显示相关数值,通过按键和USMART控制PWM DAC的输出值。我们需要用到ADC采集DAC的输出电压,所以需要在硬件上将PWM DAC和ADC短接起来,PWM DAC部分原理图如图25.2.1所示:
图25.2.1 PWM DAC原理图

       在硬件上,我们还需要用跳线帽短接多功能端口的PDC和ADC,如图25.2.2所示:
图25.2.2 硬件连接示意图 

25.3 软件设计
找到上一章的工程,然后打开USER文件夹下的工程,打开之前的timer.c文件,在最后添加一个新的函数:TIM4_PWM_Init,该函数代码如下:
//TIM4 CH1 PWM输出设置
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM4_PWM_Init(u16 arr,u16 psc)
{                                               
       RCC->APB1ENR|=1ARR=arr;                        //设定计数器自动重装值
       TIM4-&gtSC=psc;                        //预分频器分频设置
       TIM4->CCMR1|=7CCR1
void TIM3_Int_Init(u16 arr,u16 psc);
void TIM3_PWM_Init(u16 arr,u16 psc);
void TIM5_Cap_Init(u16 arr,u16 psc);
void TIM4_PWM_Init(u16 arr,u16 psc);
#endif
该部分代码在原有基础上添加了TIM4_PWM_Init函数的声明,并添加PWM_DAC_VAL宏定义,用于改变TIM4_CH1的PWM占空比,从而控制PWM DAC的输出。
接下来我们在test.c里面,修改代码如下:
//设置输出电压
//vol:0~330,代表0~3.3V
void PWM_DAC_Set(u16 vol)
{
       float temp=vol;
       temp/=100;
       temp=temp*256/3.3;
       PWM_DAC_VAL=temp;         
}
int main(void)
{    
       u16 adcx; u8 key;
       float temp; u8 t=0; u16 pwmval=0;            
      Stm32_Clock_Init(9);    //系统时钟设置
       uart_init(72,9600);      //串口初始化为9600
       delay_init(72);                  //延时初始化
       LED_Init();                //初始化与LED连接的硬件接口
       LCD_Init();                  //初始化LCD
       usmart_dev.init(72);      //初始化USMART       
       KEY_Init();                  //按键初始化             
      Adc_Init();                  //ADC初始化
       TIM4_PWM_Init(255,0);//TIM4 PWM初始化, Fpwm=72M/256=281.25Khz.          
      POINT_COLOR=RED;         //设置字体为红色
       LCD_ShowString(60,50,200,16,16,"WarShip STM32");   
       LCD_ShowString(60,70,200,16,16,&quotWM DAC TEST"); 
       LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
       LCD_ShowString(60,110,200,16,16,"2012/9/8");      
       LCD_ShowString(60,130,200,16,16,"WK_UP:+ KEY1:-");   
       //显示提示信息                                                                                
       POINT_COLOR=BLUE;//设置字体为蓝色
       LCD_ShowString(60,150,200,16,16,&quotWM VAL:");        
       LCD_ShowString(60,170,200,16,16,"DAC VOL:0.000V");            
       LCD_ShowString(60,190,200,16,16,"ADC VOL:0.000V");             
       PWM_DAC_VAL=pwmval;//初始值为0                      
       while(1)
       {
              t++;
              key=KEY_Scan(0);                      
              if(key==4)
              {           
                     if(pwmval10)pwmval-=10;
                     else pwmval=0;
                     PWM_DAC_VAL=pwmval;        //输出
              }    
              if(t==10||key==2||key==4)          //WK_UP/KEY1按下了,或者定时时间到了
              {      
                    adcx=PWM_DAC_VAL;
                     LCD_ShowxNum(124,150,adcx,3,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_CH1,20);           //得到ADC转换值        
                     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);
       }
}
此部分代码,同上一章的基本一样,先对需要用到的模块进行初始化,然后显示一些提示信息,本章我们通过WK_UP和KEY1(也就是上下键)来实现对PWM脉宽的控制,经过RC滤波,最终实现对DAC输出幅值的控制。按下WK_UP增加,按KEY1减小。同时在LCD上面显示TIM4_CCR1寄存器的值、PWM DAC设计输出电压以及ADC采集到的实际输出电压。同时DS0闪烁,提示程序运行状况。
不过此部分代码还有一个PWM_DAC_Set函数,用于USMART调用,从而通过串口控制PWM DAC的输出,所以还需要将PWM_DAC_Set函数加入USMART控制,方法前面已经有详细的介绍了,大家这里自行添加,或者直接查看我们光盘的源码。
25.4 下载验证
在代码编译成功之后,我们通过下载代码到ALIENTEK战舰STM32开发板上,可以看到LCD显示如图25.4.1所示:
图25.4.1 PWM DAC实验测试图

同时伴随DS0的不停闪烁,提示程序在运行。此时,我们通过按WK_UP按键,可以看到输出电压增大,按KEY1则变小。
大家可以试试在USMART调用PWM_DAC_Set函数,来设置PWM DAC的输出电压,如图25.4.2所示:
图25.4.2 通过usmart设置PWM DAC的电压输出

 
《STM32开发指南》第二十五章 PWM DAC实验.rar (660.48 KB, 下载次数: 26)
回复

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版