衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【GD32L233C-START】DAC輸出(正弦波、鋸齒波、方波)

西安樂拓精益 ? 2022-07-11 09:43 ? 次閱讀

1.介紹
GD32L233C采用的是一款M23的內(nèi)核。這個芯片據(jù)說功耗非常的低,低到什么程度呢?等后面我們再進行測試,今天我們主要來測試GD32L233C-STARTDAC,既然要測試DAC,示波器是不可少的,這個實驗在家做,然而LZ家里并沒有示波器,不過最近看到一款好東西,LOTO虛擬示波器,看過這款示波器的參數(shù),還不錯。所以入手了一款,測量芯片輸出的DAC應(yīng)該沒什么問題,接下來開始測試吧。
2.設(shè)計
首先需要輸出讓芯片輸出DAC,而且還需要輸出波形,這個稍微費點功夫,之前在GD32L233C-START移植了RTThread,現(xiàn)在在這個代碼的基礎(chǔ)上添加DAC的輸出程序,這個程序移植了其他網(wǎng)友的,代碼我也貼出來,經(jīng)過測試,代碼沒有啥問題:
比較麻煩的是正弦波的代碼:

const float sinus_I_quarter[91] =
{
0.0000, 0.0175, 0.0349, 0.0523, 0.0698, 0.0872, 0.1045, 0.1219, 0.1392, 0.1564, // 00 .. 09
0.1736, 0.1908, 0.2079, 0.2250, 0.2419, 0.2588, 0.2756, 0.2924, 0.3090, 0.3256, // 10 .. 19
0.3420, 0.3584, 0.3746, 0.3907, 0.4067, 0.4226, 0.4384, 0.4540, 0.4695, 0.4848, // 20 .. 29
0.5000, 0.5150, 0.5299, 0.5446, 0.5592, 0.5736, 0.5878, 0.6018, 0.6157, 0.6293, // 30 .. 39
0.6428, 0.6561, 0.6691, 0.6820, 0.6947, 0.7071, 0.7193, 0.7314, 0.7431, 0.7547, // 40 .. 49
0.7660, 0.7771, 0.7880, 0.7986, 0.8090, 0.8192, 0.8290, 0.8387, 0.8480, 0.8572, // 50 .. 59
0.8660, 0.8746, 0.8829, 0.8910, 0.8988, 0.9063, 0.9135, 0.9205, 0.9272, 0.9336, // 60 .. 69
0.9397, 0.9455, 0.9511, 0.9563, 0.9613, 0.9659, 0.9703, 0.9744, 0.9781, 0.9816, // 70 .. 79
0.9848, 0.9877, 0.9903, 0.9925, 0.9945, 0.9962, 0.9976, 0.9986, 0.9994, 0.9998, // 80 .. 89
1.0000 // 90
};

#define CIRCLE_QUARTER_1 1
#define CIRCLE_QUARTER_2 2
#define CIRCLE_QUARTER_3 3
#define CIRCLE_QUARTER_4 4
float sinus_lookup (unsigned int angle)
{
float sin_value;
unsigned int circle_quarter;
// correct angles outside the accepted angle range into 0 .. 359
if (angle > 359u)
angle = angle % 360u;
circle_quarter = 1 + (angle / 90u);
switch (circle_quarter)
{
case CIRCLE_QUARTER_1: // 00 .. 89
sin_value = sinus_I_quarter[angle];
break;
case CIRCLE_QUARTER_2: // 90 .. 179
sin_value = sinus_I_quarter[180 - angle];
break;
case CIRCLE_QUARTER_3: // 180 .. 269
sin_value = -sinus_I_quarter[angle - 180];
break;
case CIRCLE_QUARTER_4: // 270 .. 359
sin_value = -sinus_I_quarter[360 - angle];
break;
}
return sin_value;
}

void plot_sin(uint32_t f, uint32_t delta_f)
{
/* 定時周期為T=1/delta_f, f=1/(pMax*T) */
static uint32_t point = 0;
uint32_t pMAX = delta_f/f;
uint32_t value = 0;
if (point++ > pMAX) point = 0;
value = (uint32_t)((sinus_lookup(360*point/pMAX)+1)*10000)*2047/10000;
dac_software_trigger_enable();
dac_data_set(DAC_ALIGN_12B_R, value);
}

接下來是鋸齒波和方波的代碼,這兩個代碼比較簡單:

void plot_triangle(uint32_t f, uint32_t delta_f)
{
/* 定時周期為T=1/delta_f, f=1/(pMax*T) */
static uint32_t point = 0;
uint32_t pMAX = delta_f/f;
uint32_t pMAX2 = pMAX/2;
uint32_t value = 0;
if (++point > pMAX) point = 0;
if (point < pMAX2)
{
value = point * 4095 / pMAX2;
}
else
{
value = (pMAX - point) * 4095 / pMAX2;
}
dac_software_trigger_enable();
dac_data_set(DAC_ALIGN_12B_R, value);
}
void plot_square(uint32_t f, uint32_t delta_f)
{
/* 定時周期為T=1/delta_f, f=1/(pMax*T) */
static uint32_t point = 0;
uint32_t pMAX = delta_f/f;
uint32_t pMAX2 = pMAX/2;
uint32_t value = 0;
if (++point > pMAX) point = 0;
if (point < pMAX2)
{
value = 0;
}
else
{
value = 0xFFF;
}
dac_software_trigger_enable();
dac_data_set(DAC_ALIGN_12B_R, value);
}

最后需要開啟一個定時器,還有DAC的初始化:

void timerx_init(uint32_t timer_periph, uint16_t period, uint16_t prescaler)
{
/* TIMER1 configuration: input capture mode -------------------
the external signal is connected to TIMER1 CH0 pin (PA0)
the rising edge is used as active edge
the TIMER1 CH0CV is used to compute the frequency value
------------------------------------------------------------ */
timer_parameter_struct timer_initpara;
timer_ic_parameter_struct timer_icinitpara;

/* enable the peripherals clock */
rcu_periph_clock_enable(RCU_TIMER2);

/* deinit a TIMER */
timer_deinit(timer_periph);
/* initialize TIMER init parameter struct */
timer_struct_para_init(&timer_initpara);
/* TIMER1 configuration */
timer_initpara.prescaler = prescaler;
timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
timer_initpara.counterdirection = TIMER_COUNTER_UP;
timer_initpara.period = period;
timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
timer_init(timer_periph, &timer_initpara);

/* TIMER1 CH0 input capture configuration */
timer_icinitpara.icpolarity= TIMER_IC_POLARITY_RISING;
timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;
timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;
timer_icinitpara.icfilter = 0x00;
timer_input_capture_config(timer_periph, TIMER_CH_0, &timer_icinitpara);

/* auto-reload preload enable */
timer_auto_reload_shadow_enable(timer_periph);
/* clear channel 0 interrupt bit */
timer_interrupt_flag_clear(timer_periph, TIMER_INT_CH0);
/* channel 0 interrupt enable */
timer_interrupt_enable(timer_periph, TIMER_INT_CH0);

/* enable a TIMER */
timer_enable(timer_periph);
}

#define DAC_WAVE_TEST

void timer2_init(void)
{
timer_deinit(TIMER2);
rcu_periph_clock_enable(RCU_TIMER2);
#ifdef DAC_WAVE_TEST
timerx_init(TIMER2, 639, 9);// 100KHz 0.1ms
#endif
timer_interrupt_enable(TIMER2, TIMER_INT_UP);
nvic_irq_enable(TIMER2_IRQn, 3);
}

void TIMER2_IRQHandler(void)
{
#ifdef DAC_WAVE_TEST
plot_sin(100, 10000); //正弦波
//plot_triangle(1, 10000);//鋸齒波
//plot_square(1, 10000); //方波
#endif
timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP);
}

void dac1_init(void)
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_DAC);
gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_4);
dac_deinit();
/* software trigger */
dac_trigger_enable();
dac_trigger_source_config(DAC_TRIGGER_SOFTWARE);
/* no noise wave */
dac_wave_mode_config(DAC_WAVE_DISABLE);
/* noise wave - triangle */
//dac_wave_mode_config(DAC_WAVE_MODE_TRIANGLE);
//dac_triangle_noise_config(DAC_TRIANGLE_AMPLITUDE_4095);
/* noise wave - lfsr */
//dac_wave_mode_config(DAC_WAVE_MODE_LFSR);
//dac_lfsr_noise_config(DAC_LFSR_BITS11_0);
dac_output_buffer_enable();
/* enable DAC and set data */
dac_enable();
dac_software_trigger_enable();
dac_data_set(DAC_ALIGN_12B_R, 0);
}

這樣就可以輸出正弦波、鋸齒波和方波了。
3.波形測量
接下來我們來看一下輸出的波形是否符合要求,首先需要將【GD32L233C-START】開發(fā)板連接LOTO示波器,分別連接GND和PA4管教,連接效果圖如下圖1所示。

pYYBAGLLgA-ALleqAAEijK3TbPg311.png

圖1


然后讓DAC輸出正弦波,看一下波形如何。

poYBAGLLgA-ACO87AACyN65vJzA238.png

圖2


從上圖2中可以看到,一個周期大約在10ms,所以正弦波的周期為100Hz,輸出還是聽精準(zhǔn)的。
然后輸出鋸齒波看看波形如何。

poYBAGLLgA-AP8vpAACyQLQS5Hk395.png

圖3


從上圖3可以得出,鋸齒波的波形頻率為1Hz。
最后我們來看看方波的波形圖如何。

pYYBAGLLgA-AUNobAACvY54PfmY014.png

圖4


從上圖4可以看到,方波的波形頻率為1Hz。
從上面波形可以得出,【GD32L233C-START】的定時器比較精準(zhǔn),DAC的輸出值也比較穩(wěn)定,性能還是不錯的!
4.總結(jié)
剛?cè)胧值腖OTO示波器還不錯,測量的精度挺高的,不過還有好多設(shè)置沒弄明白,等后續(xù)多琢磨琢磨。做電子的示波器是必不可少的,我先替你們測試測試這個示波器如何。
GD32L233C是新出來的芯片,整體功能還需要多進行測試,它最突出的低功耗后續(xù)要好好測量一下,這次就先到這里了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 示波器
    +關(guān)注

    關(guān)注

    113

    文章

    6282

    瀏覽量

    185842
收藏 人收藏

    評論

    相關(guān)推薦

    假設(shè)正弦波每個周期采20個點,DAC900的產(chǎn)生正弦波極限頻率是多少?

    假設(shè)正弦波每個周期采20個點。那個DAC900的產(chǎn)生正弦波極限頻率是多少?
    發(fā)表于 01-14 07:08

    DAC8411輸出正弦波發(fā)生畸變是什么原因?qū)е碌模?/a>

    我用DAC8411輸出正弦波,因為我用ADC采集的輸入信號也是正弦波。想驗證DAC8411的功能,但是
    發(fā)表于 01-08 07:04

    ADS1291輸入5mV的正弦波,顯示的時候幅值很大,怎么解決?

    ADS1291,輸入5mV的正弦波,但是顯示的時候就幅值很大,輸入方波,三角燈都沒有問題,使用的1P,1N, 輸出電路2種辦法: 1:使用33NF電容+電阻10K,+22K的情況:
    發(fā)表于 12-18 06:19

    DAC8832能否輸出正弦波方波

    DAC8832能否輸出正弦波方波?若可以,輸出正弦波
    發(fā)表于 11-29 14:01

    為什么DAC8830輸出100mV正弦波的時候毛刺這么大?

    C101電容的波形,發(fā)現(xiàn)它們的毛刺都一模一樣,下圖是我測的DAC8830的Vout引腳的波形: 波形測量方式: 請問為什么DAC8830輸出100mV
    發(fā)表于 11-15 06:30

    DAC7821產(chǎn)生400Hz正弦波出現(xiàn)波形涌動,為什么?

    dac7821設(shè)計400Hz正弦波輸出,電路完全按照TI官網(wǎng)給的電路設(shè)計,輸出正弦波頻率正常,但是示波器時間打成1秒看波形,就是正樣子。
    發(fā)表于 11-14 08:14

    請問DAC63202能否調(diào)控正弦幅值輸出?

    DAC63202有一個內(nèi)嵌的函數(shù)波形輸出功能,可以通過配置寄存器來輸出內(nèi)置的方波,正弦波,鋸齒
    發(fā)表于 11-13 08:08

    正弦波逆變器的定義和基本結(jié)構(gòu)

    的逆變器(如方波逆變器和梯形逆變器)相比,其輸出的交流電波形更加接近市電的正弦波形,因此具有更高的電能質(zhì)量和更廣泛的應(yīng)用范圍。
    的頭像 發(fā)表于 10-05 15:09 ?708次閱讀
    <b class='flag-5'>正弦波</b>逆變器的定義和基本結(jié)構(gòu)

    DAC0832外接LM324輸出正弦波信號,為什么不能正確輸出波形?

    問題是這樣的,我有一個DAC電路,DAC0832外接LM324輸出正弦波信號,然后我用這個正弦信號驅(qū)動運放,為什么不能正確
    發(fā)表于 08-22 06:44

    如何把1khz方波濾成正弦波

    把1kHz方波濾成正弦波是一個涉及信號處理和濾波器設(shè)計的問題。 引言 方波是一種具有兩個電平的周期性信號,通常用于數(shù)字電路和通信系統(tǒng)中。然而,在某些應(yīng)用中,我們需要將方波轉(zhuǎn)換為
    的頭像 發(fā)表于 07-23 14:27 ?2147次閱讀

    220v方波怎樣才能變成正弦波

    在電子工程和電力系統(tǒng)中,波形轉(zhuǎn)換是一種常見的需求。方波正弦波是兩種基本的波形,它們在不同的應(yīng)用中扮演著重要的角色。方波是一種具有固定頻率和幅度的波形,其特點是在極短時間內(nèi)從零上升到最大值,然后再
    的頭像 發(fā)表于 07-23 14:22 ?1279次閱讀

    在模擬電路中怎么把正弦波變成方波

    在模擬電路中,將正弦波轉(zhuǎn)換為方波是一種常見的信號處理技術(shù)。 正弦波方波的基本概念 1.1 正弦波 正弦
    的頭像 發(fā)表于 07-23 14:19 ?3728次閱讀

    如何將方波轉(zhuǎn)換為正弦波

    方波正弦波是電子工程中兩種常見的波形。方波以其簡單的波形和易于產(chǎn)生的特點在數(shù)字電路中應(yīng)用廣泛,而正弦波則因其平滑的波形和頻譜特性在模擬電路、通信、音頻處理等領(lǐng)域占據(jù)重要地位。將
    的頭像 發(fā)表于 07-22 15:16 ?6396次閱讀

    任意是什么意思?怎么調(diào)呢?

    任意波形是指可以按照用戶需求生成的波形,它不同于傳統(tǒng)的正弦波方波鋸齒等標(biāo)準(zhǔn)波形
    的頭像 發(fā)表于 05-28 16:23 ?550次閱讀

    正弦波調(diào)制和方波調(diào)制的有效值怎么決定?

    以載波三角和調(diào)制正弦波比較生成PWM,生成的PWM波形的有效值是和什么有關(guān)?或者說生成的PWM有效值是由什么控制決定的? 怎么用TITA-TA產(chǎn)生一個占空比可調(diào)的
    發(fā)表于 04-09 16:54
    大发888游戏 下载| 棋牌游戏大厅下载| 井陉县| 网上百家乐赌钱| 大发888注册送58元| 乐天堂百家乐官网娱乐场| 网上百家乐娱乐场开户注册| 百家乐官网有作弊的吗| 淘金百家乐现金网| 皇冠真钱| 适合属虎做生意的名字| bet365 uo15| 单耳房做生意的风水| 亲朋棋牌官网| 24山吉凶| 注册送现金真人棋牌| 老牌百家乐娱乐城| 蒙特卡罗娱乐| 真人百家乐娱乐好玩| 金寨县| 网上百家乐游戏下载| 百家乐官网洗码全讯网| 百家乐博赌场| 太阳城百家乐官网娱乐官方网| 威尼斯人娱乐官方| 百家乐官网路子分| 大发888游戏破解秘籍| 博彩qq群| 红宝石百家乐娱乐城 | 关于百家乐官网概率的书| 凱旋門百家乐官网娱乐城| 百家乐官网投注网站是多少| 澳门百家乐娱乐城送彩金| 浦城县| 百家乐园云鼎赌场娱乐网规则 | 百家乐ag厅投注限额| 乐百家乐官网彩娱乐城| 郑州市太阳城宾馆| 免费百家乐官网计划| 游戏百家乐官网押发| 澳门百家乐娱乐平台|