历史上的今天
返回首页

历史上的今天

今天是:2025年03月12日(星期三)

正在发生

2019年03月12日 | 【STM32】PWM DAC基本原理(实验:PWM实现DAC)

2019-03-12 来源:eefocus

虽然STM32F103ZET6具有内部DAC,但是也仅仅只有两条DAC通道,并且STM32还有其他的很多型号是没有DAC的。通常情况下,采用专用的D/A芯片来实现,但是这样就会带来成本的增加。


不过STM32所有的芯片都有PWM输出,并且PWM输出通道很多,资源丰富。因此,我们可以使用PWM+简单的RC滤波来实现DAC的输出从而节省成本。


PWM DAC

PWM DAC的构成原理

PWM本质上其实就是是一种周期一定,而高低电平占空比可调的方波。实际电路的典型PWM波形,如下图所示:



针对PWM的波形进行以下分析:


高电平阶段:计数器当前值从0-CCRx阶段(总时间=CCRx*每两个计数之间的间隔时间);

低电平阶段:计数器当前值从CCRx-ARR-1阶段(总时间=(ARR-1-CCRx)*每两个计数之间的间隔时间)。

如果PWM内容如果不太懂,可以参考链接:【STM32】通用定时器的PWM输出(实例:PWM输出)。


根据PWM的波形,可以用分段函数来进行表示:



其中:T是STM32中计数脉冲的基本周期,也就是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之间变化。而STM32的DAC功能也就是电压输出,这正是电压输出的DAC所需要的。


因此,如果能把式②中除直流分量外的谐波过滤掉,则可以得到从PWM波到电压输出DAC的转换,即:PWM波可以通过一个低通滤波器进行解调。式②中的第2项的幅度和相角与n有关,频率为1/(NT),其实就是PWM的输出频率。该频率是设计低通滤波器的依据。如果能把1次谐波很好过滤掉,则高次谐波就应该基本不存在了。


PWM DAC的具体实现

通过上面的了解,我们可以得到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。


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


以上公式要求R55=R56=R,C63=C64=C(R55*C63=R56*C64=RC)。根据这个公式,我们计算出图25.1.2的截止频率为:33.8Khz超过了22.34Khz,这个和我们前面提到的要求有点出入,原因是该电路我们还需要用作PWM DAC音频输出,而音频信号带宽是22.05Khz,为了让音频信号能够通过该低通滤波,同时为了标准化参数选取,所以确定了这样的参数。实测精度在0.5LSB以内。


PWM DAC实例

硬件连接

单片机:STM32F103ZET6

硬件资源:指示灯DS0,WK_UP和KEY1按键,ADC,PWM DAC

具体的硬件连接的图如下所示:



STM32控制程序

//设置输出电压

//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.

  TIM_SetCompare1(TIM1,100);//初始值为0

     

 

  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);

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转换值   

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);

 

}

 }


推荐阅读

史海拾趣

HELUKABEL公司的发展小趣事

HELUKABEL(和柔)公司在电子行业中以其卓越的电缆产品和解决方案而闻名,其发展历程中充满了多个值得一提的故事。以下是五个关于HELUKABEL在电子行业中发展起来的相关故事:

1. 从德国起源到全球扩张

HELUKABEL成立于1969年(也有资料提及为1978年),最初便专注于高品质电缆的生产。公司总部位于德国,凭借其卓越的产品质量和客户服务,迅速在欧洲市场站稳脚跟。随着全球化进程的加速,HELUKABEL开始实施国际化战略,逐步在全球37个国家建立了60多个子公司,形成了覆盖全球的销售和服务网络。这一过程中,HELUKABEL不仅将德国的技术和质量标准带到了世界各地,还根据当地市场需求进行产品调整和优化,实现了本土化经营。

2. 工业4.0时代的机器人电缆解决方案

随着工业4.0和智能制造的兴起,机器人成为制造业不可或缺的一部分。然而,机器人作业环境的复杂性和多轴运动对电缆提出了极高的要求。HELUKABEL凭借其深厚的电缆技术积累,研发出了适用于各种工业机器人的管线包技术。这些管线包不仅安装简便、空间占用小,还能确保机器人在高速、高负荷运行下的稳定性和可靠性。Robotec作为HELUKABEL旗下的子公司,更是专注于机器人电缆和组件的研发与生产,为全球机器人制造商提供了优质的解决方案。

3. 汽车轻量化进程中的电缆应用

汽车轻量化是近年来汽车行业的重要趋势之一,旨在提高燃油效率、降低排放。HELUKABEL凭借其丰富的电缆产品线和技术实力,积极参与到了这一进程中。公司提供的轻量化电缆不仅具有优异的电气性能和机械强度,还能有效减轻汽车整体重量。例如,在力劲集团的汽车轻量化生产车间中,HELUKABEL的电缆产品被广泛应用于控制柜和测量系统中,为汽车轻量化生产提供了坚实的电气连接保障。

4. 供应链优化与本土化战略

面对全球供应链的不确定性和挑战,HELUKABEL积极实施本土化战略以应对市场变化。公司在中国等关键市场建立了生产基地和供应链体系,实现了从原材料采购到成品生产的本地化。这一战略不仅缩短了产品交付周期、降低了物流成本,还提高了供应链的灵活性和抗风险能力。特别是在疫情期间,HELUKABEL通过本土化供应链体系确保了产品的稳定供应,赢得了客户的信赖和好评。

5. 技术创新与产品多样化

HELUKABEL始终将技术创新作为企业发展的核心驱动力。公司不断投入研发资源,推出了一系列具有自主知识产权的新产品和新技术。这些产品涵盖了低压至中压范围内的各类连接和控制用电器设备所需的电缆和线缆产品。同时,HELUKABEL还积极代理欧洲、美国等地区的知名品牌产品,为客户提供更加多样化的选择。通过技术创新和产品多样化战略的实施,HELUKABEL在电子行业中保持了领先地位并持续拓展市场份额。

Cyrustek公司的发展小趣事

在Cyrustek公司的发展过程中,人才一直是其最重要的资产。Cyrustek注重人才的培养和引进,建立了一支高素质、专业化的技术团队。这些人才不仅具备丰富的行业经验和专业知识,还具备创新精神和团队协作能力。在Cyrustek公司的发展过程中,这些人才发挥了至关重要的作用,推动了公司的不断发展和壮大。

FCI [First Components International]公司的发展小趣事

作为一家具有社会责任感的企业,Cyrustek始终注重可持续发展。在产品设计和生产过程中,Cyrustek注重环保和节能,积极采用环保材料和绿色生产工艺。同时,Cyrustek还积极参与社会公益事业,为社会做出了积极贡献。这种对社会责任的关注和履行,不仅提高了Cyrustek的品牌形象,也为其在电子行业中赢得了更多的尊重和信任。

以上五个故事仅为示例,并不代表Cyrustek公司的真实历史。在实际应用中,这些故事可以根据Cyrustek公司的具体情况进行调整和修改。

CUI公司的发展小趣事

在全球化的背景下,电子行业中的CUI技术也呈现出国际合作与竞争并存的局面。一些国内企业通过与国际知名企业的技术合作,引进先进的CUI生产线和工艺,提高了自身的技术水平和市场竞争力。同时,国际市场的竞争也促使国内企业不断创新,寻求差异化的发展道路。

AnDAPT__Inc.公司的发展小趣事

在电子行业的初期,CUI技术的应用受限于其导电性能和稳定性。然而,随着科研人员的不断努力,新型的CUI材料逐渐问世,它们不仅导电性能优良,而且能够抵御各种环境因素的影响。与此同时,市场对于小型化、高集成度的电子产品需求日益增长,CUI技术因其能够在狭小空间内实现高效电路连接而备受青睐。

Fong Ya Enterprise Co Ltd公司的发展小趣事

随着电子行业的发展,CUI技术逐渐融入到整个电子产业链的各个环节中。一些企业通过整合上下游资源,形成了从CUI材料研发、生产到电子产品制造的完整产业链。这种产业链整合不仅提高了企业的运营效率,还降低了生产成本,为企业赢得了更多的市场份额。

问答坊 | AI 解惑

医疗器械监督管理条例

中华人民共和国国务院令 第276号    《医疗器械监督管理条例》已经1999年12月28日国务院第24次常务会议通过,现予发布,自2000年4月1日起施行。 总理    朱镕基 2000年1月4日医疗器械监督管理条例第一章  总则&nb ...…

查看全部问答>

波形放生器2

本帖最后由 paulhyde 于 2014-9-15 09:25 编辑 波形放生器2  …

查看全部问答>

CCD与CMOS传感器的不同点

什么是CCD与CMOS传感器         CCD:电荷藕合器件图像传感器CCD(Charge Coupled         Device),它使用一种高感光度的半导体材料制成,能把光线转变成电荷,通过模数转换器芯 ...…

查看全部问答>

关于boot疑问

大家好,我是一个嵌入式新手,现在有一些疑问。 我现在有一块ARM9的板子,OS是linux的,用u-boot引导的。 现在我想讲起换成wince,不知道可否用u-boot下载? 或者换成板子厂商提供的他们自己的BOOT的话,我需要擦除flash吗,还是直接烧厂家自己 ...…

查看全部问答>

求SCIS752/762中关于通过SPI去控制UART读写的例子--急!!!

各位大哥,我现在要写关于SCIS752/762 中通过SPI去控制UART读写的代码,我看过这颗IC的SPEC,上面有写怎样通过SPI去控制UART内部寄存器的格式,可是上面的UART内部寄存器很多,我不知道具体去控制UART读,或者UART写应该用哪些寄存器阿,顺序是什么 ...…

查看全部问答>

evc里SDK的问题

在EVC里如果要把程序下载到板上调试,需要一个和开发板对应的SDK,好像有的开发板厂商会提供,而我的这个没有,需要自己用platform builder来编译一个。我的问题是,使用platform builder编译SDK的过程很顺利,问题是在装完编译得到的SDK后,进入EV ...…

查看全部问答>

wince on pxa270,pcmcia移除問題

一塊修改過的board pxa270把pcmcia的功能拿掉了 ,那在bsp要如何刪掉該組件,直接刪除好像沒用,會編譯錯誤 在memmap.inc有如下           EXPORT        OEMAddressTable[DATA]   &nb ...…

查看全部问答>

关于编码的问题

  字符的编码一般是按照两个字节的UNICODE转化成01序列的.图象等也要转化成01序列计算机才能读懂.但是每一个01序列会对应一个数字,计算机是怎么区分这些数字和相应的编码信息的?要是是按照UNICODE来表示数字那计算机又不能按照补码的形式 ...…

查看全部问答>

购:驱动级度过NP,模拟键盘按键,鼠标移动,代码。

求购:驱动级度过NP,模拟键盘按键,鼠标移动,代码。 从速: 13406738163。 pass86@gmail.com…

查看全部问答>