#申请原创# #技术资源# G32R501这款单片机有一个12位的DAC,由一个内部 12 位 DAC 和一个能够驱动外部负载的模拟输出缓冲区组成,可以产生正弦波、方波、三角波等交流波形和直流电压。
那我就测试测试看看,首先找到DEMO工程,我用的是\device_support\g32r501\examples\eval\dac\dac_ex1_enable 目录下的示例程序,编译下载,打开数据手册,看看是哪个引脚输出,看了一下工程,是dac-a输出
15脚输出,接到了jp1排针上,需要注意的是,参数电压要短接,也就是如图下面的引脚要短接
然后测试就能输出一个1.6V左右的电压,下面就把代码改一下,让它输出正弦波。
先定义几个宏
- #define SINE_SAMPLES 256
- #define DAC_MAX 4095
- #define DAC_MID (DAC_MAX / 2)
- uint16_t sine_index = 0;
再把下载的while改成如下
- while(1)
- {
- // Generate sine wave using trigonometric function
- // sine_index cycles from 0 to SINE_SAMPLES-1
- float sine_value = sin(2.0f * 3.14159265f * sine_index / SINE_SAMPLES);
-
- // Map sine value from [-1, 1] to [0, DAC_MAX]
- dacval = (uint16_t)(DAC_MID + DAC_MID * sine_value);
-
- // Update DAC
- DAC_PTR[DAC_NUM]->DACVALS.all = dacval;
-
- // Increment index for next sample
- sine_index = (sine_index + 1) % SINE_SAMPLES;
-
- DELAY_US(2);
- }
再来用示波器测一下波形
再来改一个三角波看看
- while(1)
- {
- // Generate triangle wave - interesting sawtooth pattern
- // First half: ramp up from 0 to DAC_MAX
- // Second half: ramp down from DAC_MAX to 0
- if(sine_index < (SINE_SAMPLES / 2))
- {
- dacval = (uint16_t)((sine_index * 2 * DAC_MAX) / SINE_SAMPLES);
- }
- else
- {
- dacval = (uint16_t)(((SINE_SAMPLES - sine_index) * 2 * DAC_MAX) / SINE_SAMPLES);
- }
-
- // Update DAC
- DAC_PTR[DAC_NUM]->DACVALS.all = dacval;
-
- // Increment index for next sample
- sine_index = (sine_index + 1) % SINE_SAMPLES;
-
- DELAY_US(2);
- }
再看看波形
今天就测到这里,感谢阅读,帮忙点个赞吧!
|