
本帖最后由 kernaly 于 2015-2-21 16:21 编辑 % J, g7 J1 t. }; j) T. E 很早就开始学习使用STM32了,在工作中,产品项目更是在STM32平台进行的,但是却从没有写过几篇像样的技术贴。趁着年假闲暇之际,整理下相关的资料分享下,希望对初学者有帮助。以后也会逐步探讨、分享STM32相关的技术。感谢当年在我学习之路上帮助过我的前辈,如今我也继续下去,希望认识更多的朋友们。 对于频率幅度可调节的正弦波:: m9 |. ~1 T5 b+ G9 e 通过调节DAC触发时钟的频率来改变采集频率。通过改变DAC的输出幅度,外加运放,控制运放增益来更大范围的改变幅度。最好使用DMA,可节省MCU更多的资源。当要改变频率及其振幅的时候,只需要重新填充对应的缓冲区就好了。比如以下代码。采集1024个点,通过Amplitude_temp 来改变DAC输出振幅。调节频率的话只需改变触发时钟的频率即可。$ M; L7 p; H( W# w! `7 S3 ?# k for (Idx = 0; Idx < 1024; Idx++) { DualSine12bit[Idx] = (Amplitude_temp*sin(2*3.14*Idx/1024)+Amplitude_temp); } 关于采集点数。采集点数越多,波形的完整性越好,但在周期一定的情况下,越多的点,就需要越高的采集频率,而STM32的DAC频率却是有限的,103型最大的采集频率一般在250K左右,所以要针对自己实际情况来对采集点数和采集频率进行取舍。+ h) X# O& P+ K l& f 关于三角波,STM32自带了三角波发生器,用起来还是挺方便的。而我所讲的还是填充画点的方式,把三角波分成上下两个部分,分别进行填充画点: for (Idex = 0; Idex < 500; Idex++) { % ?" O3 b! I3 K. l DAC_SetChannel1Data(DAC2, DAC_Align_12b_R, Idex*Amplitude_temp/500); delay_ms(SJBUPTIM/500);, d2 b' W C* Q) W% H4 ]1 A } for (Idex = 500; Idex < 1000; Idex++)7 D' _; o! L+ c4 C. ]: t( ? { DAC_SetChannel1Data(DAC2, DAC_Align_12b_R, (1000-Idex)*Amplitude_temp/500);3 E% j1 P) T1 K% f; y0 f' ]# C delay_ms(SJBDOWNTIM/500);" Q+ d4 C3 k& C t8 j }, k& G* \5 Q. v 以上代码采集1000个点,通过延时函数进行频率调节(当然,需要更精确的调节要使用定时器),通过改变Amplitude_temp来改变输出振幅。- d6 V* c1 A, j* m* e 对于其他规则波形,只需按照以上思路,填充画点即可。 & b' P; g3 o' O0 k; i6 r; y3 E 6 [2 S, |- t5 V8 q$ x |
自己顶一下,话说伸手打字还是挺冷的![]() ![]() |
貌似没人。我的心啊 |
飘过。。。。。 |
学习了,。。。。。。。 |
谢谢分享 |
![]() |
![]() |
谢谢分享 |
Tingyixia感谢分享 |
不错,谢谢 |
顶一下啦 |
我想问一下,只用stm32的DAC功能产生正弦波的原理是什么?正弦表有什么用?现在还没学DMA,老师只让用DAC产生。 |
謝謝分享 |
我想知道楼主,这个表达式,为什么我放进去没效果,我用填表法就正常 |