0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于Arduino Due的三相正弦波发生器的解析

454398 来源:网络整理 作者:网络整理 2019-11-20 17:36 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

步骤1:生成正弦数据数组

由于实时计算对CPU的要求很高,因此需要一个正弦数据数组以获得更好的性能

uint32_t sin768 [] PROGMEM = 。..。

而x = [0:5375]; y = 127 + 127 *(sin(2 * pi/5376/*或您希望根据要求使用一些#*))

步骤2:启用并行输出

与Uno不同,Due具有有限的参考。但是,要基于Arduino Uno生成三相正弦波,首先,由于其MCLK低(16MHz,而Due是84MHz),因此性能不佳,第二,它的GPIO有限,可以产生最大2相输出,您需要额外的模拟电路产生第三相(C = -AB)。

启用GPIO的步骤主要是基于SAM3X的try and trial +无用数据表

PIOC-》 PIO_PER = 0xFFFFFFFE ;//PIO控制器PIO使能寄存器(请参阅ATMEL SAM3X数据表的p656)和http://arduino.cc/zh-CN/Hacking/PinMappingSAM3X、Arduino Due引脚33-41和44-51已启用

PIOC-》 PIO_OER = 0xFFFFFFFE;//PIO控制器输出使能寄存器,请参见ATMEL SAM3X数据手册p657-》 PIO_OSR = 0xFFFFFFFE;//PIO控制器输出状态寄存器,请参阅ATMEL SAM3X数据表的p658

PIOC-》 PIO_OWER = 0xFFFFFFFE;//PIO输出写使能寄存器,请参阅ATMEL SAM3X数据表的p670

//PIOA-》 PIO_PDR = 0x30000000;//作为保险是可选的,似乎并不影响性能,数字引脚10连接到PC29和PA28,数字引脚4连接到PC29和PA28,此处禁用禁用PIOA#28&29

步骤3:启用中断

为最大程度地发挥其性能,CPU负载应尽可能低。但是,由于CPU引脚和Due引脚之间的非1to1对应关系,需要进行位操作。

您可以进一步优化算法,但空间非常有限。

void TC7_Handler(void)

{TC_GetStatus(TC2,1);

t = t%样本;//使用t%samples而不是‘if’来避免t的溢出

phaseAInc =(preset * t)%5376;//使用%5376避免数组索引溢出

phaseBInc =(phaseAInc + 1792)%5376;

phaseCInc =(phaseAInc + 3584)%5376;

p_A = sin768 [phaseAInc] 《《1;//参考PIOC:PC1至PC8,对应的Arduino Due引脚:引脚33-40,因此向左移1位

p_B = sin768 [phaseBInc] 《《12;//参考PIOC:PC12至PC19,对应的Arduino Due引脚:引脚51-44,因此左移12位

p_C = sin768 [phaseCInc];//C相输出使用PIOC:PC21,PC22,PC23,PC24,PC25,PC26,PC28和PC29,对应的Arduino Due引脚:数字引脚:分别为9,8,7,6,5,4,3,10

p_C2 =(p_C&B11000000)《《22;//这会生成PC28和PC29

p_C3 =(p_C&B00111111)《《21;//这会生成PC21-PC26

p_C = p_C2 | p_C3;//这会产生C相的并行输出

p_A = p_A | p_B | p_C;//32位输出= A相(8位)| B相| C相

PIOC-》 PIO_ODSR = p_A;//输出寄存器= p_A

t ++; }

第4步:R/2R DAC

构建3x8bit R/2R DAC,在Google上加载参考。

步骤5:完整代码

#define _BV(x)(1 《《(x));

uint32_t sin768 [] PROGMEM =/* x = [0:5375 ]。 y = 127 + 127 *(sin(2 * pi/5376))*/

uint32_t p_A,p_B,p_C,p_C2,p_C3;//A相B相C值-尽管输出仅8位,但p_A和p_B值将被操作以生成新的32位值,以应对32位PIOC输出

uint16_t phaseAInc,phaseBInc ,phaseCInc,freq,freqNew; uint32_t间隔; uint16_t个样本,预设; uint32_t t = 0;

void setup(){

//并行输出PIOC设置:Arduino Due引脚33-40被用作A相输出,而44-51引脚则用于A相B输出

PIOC-》 PIO_PER = 0xFFFFFFFE;//PIO控制器PIO使能寄存器(请参阅ATMEL SAM3X数据表的p656)和http://arduino.cc/zh-CN/Hacking/PinMappingSAM3X、Arduino Due引脚33-41和44-51已启用

PIOC-》 PIO_OER = 0xFFFFFFFE;//PIO控制器输出使能寄存器,请参阅ATMEL SAM3X数据表的p657

PIOC-》 PIO_OSR = 0xFFFFFFFE;//PIO控制器输出状态寄存器,请参阅ATMEL SAM3X数据表的p658

PIOC-》 PIO_OWER = 0xFFFFFFFE;//PIO输出写使能寄存器,请参阅ATMEL SAM3X数据表的p670

//PIOA-》 PIO_PDR = 0x30000000;//作为保险,是可选的,似乎不影响性能,数字引脚10连接到PC29和PA28,数字引脚4连接到PC29和PA28,此处禁用禁用PIOA#28和29//定时器设置,请参阅http ://arduino.cc/en/Hacking/PinMappingSAM3X,

pmc_set_writeprotect(false);//禁用电源管理控制寄存器的写保护

pmc_enable_periph_clk(ID_TC7);//启用外设时钟时间计数器7

TC_Configure(/*时钟*/TC2,/*通道*/1,TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1);//TC时钟42MHz(时钟,通道,比较模式设置)TC_SetRC(TC2,1,interval); TC_Start(TC2,1);

//在计时器TC2-》 TC_CHANNEL [1]上启用计时器中断。TC_IER= TC_IER_CPCS;//IER =中断允许寄存器TC2-》 TC_CHANNEL [1] .TC_IDR =〜TC_IER_CPCS;//IDR =中断禁止寄存器

NVIC_EnableIRQ(TC7_IRQn);//在嵌套向量中断控制器freq = 60中启用中断;//将频率初始化为60Hz预设= 21;//数组索引增加21个样本= 256;//输出样本256/周期间隔= 42000000/(频率*样本);//中断计数TC_SetRC(TC2,1,interval);//启动TC Serial.begin(9600);//出于测试目的}

void checkFreq()

{freqNew = 20000;

if(freq == freqNew){}其他

{freq = freqNew;

if(freq》 20000){freq = 20000;/*最大频率20kHz */};

,如果(freq 《1){freq = 1;/*最低频率1Hz */};

如果(freq》 999){preset = 384;样本= 14;}//对于频率》 = 1kHz,每个周期14样本

否则(freq》 499){preset = 84;样本= 64;}//对于500 《=频率《1000Hz,每个周期64个样本,否则(freq》 99){preset = 42; samples = 128;}//对于100Hz 《= frequency 《500Hz,128个采样/周期

else {preset = 21;样本= 256;};//对于频率《100hz,每个周期256个采样

间隔= 42000000/(freq * samples); t = 0; TC_SetRC(TC2,1,间隔); }}

void loop(){

checkFreq();延迟(100); }

void TC7_Handler(void)

{TC_GetStatus(TC2,1);

t = t%样本;//使用t%samples引起t phase的溢出AInc =(preset * t)%5376;//使用%5376避免数组索引溢出

phaseBInc =(phaseAInc + 1792)%5376;

phaseCInc =(phaseAInc + 3584)%5376;

p_A = sin768 [phaseAInc] 《《1;//参考PIOC:PC1至PC8,对应的Arduino Due引脚:引脚33-40,因此向左移1位

p_B = sin768 [phaseBInc] 《《12;//参考PIOC:PC12至PC19,对应的Arduino Due引脚:引脚51-44,因此左移12位

p_C = sin768 [phaseCInc];//C相输出使用PIOC:PC21,PC22,PC23,PC24,PC25,PC26,PC28和PC29,对应的Arduino Due引脚:数字引脚:分别为9,8,7,6,5,4,3,10

p_C2 =(p_C&B11000000)《《22;//这会生成PC28和PC29

p_C3 =(p_C&B00111111)《《21;//这将生成PC21-PC26//Serial.println(p_C3,BIN); p_C = p_C2 | p_C3;//这会产生C相的并行输出

p_A = p_A | p_B | p_C;//32位输出= A相(8位)| B相| C相////Serial.println(p_A》》21,BIN);//PIOC-》 PIO_ODSR = 0x37E00000;

PIOC-》 PIO_ODSR = p_A;//输出寄存器= p_A t ++; }
责任编辑:wv

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 发生器
    +关注

    关注

    4

    文章

    1423

    浏览量

    64412
  • Arduino
    +关注

    关注

    190

    文章

    6515

    浏览量

    196009
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    普源DG1022Z信号发生器正弦波频率调节指南

    普源DG1022Z信号发生器作为一款高性能的双通道波形发生器,可灵活输出正弦波、方波、等多种波形,广泛应用于电子测试、科研实验及教学场
    的头像 发表于 10-14 16:53 456次阅读
    普源DG1022Z信号<b class='flag-5'>发生器</b><b class='flag-5'>正弦波</b>频率调节指南

    信号发生器选型指南:函数、射频与任意波形的差异与适用场景

    者的差异,为选型提供参考。   一、函数发生器:基础测试的“万能工具” 函数发生器以生成标准波形为核心功能,典型输出包括正弦波、方波、
    的头像 发表于 09-23 18:01 694次阅读
    信号<b class='flag-5'>发生器</b>选型指南:函数、射频与任意波形的差异与适用场景

    信号发生器产生正弦波的频率精准调节方法

    一、技术原理与核心方法 正弦波频率的精准调节依赖于信号发生器的内部架构与算法,常见技术包括: 1. 直接数字频率合成(DDS)技术 通过数字信号处理生成正弦波,利用CPLD或FPGA实现正弦
    的头像 发表于 08-27 17:49 738次阅读
    信号<b class='flag-5'>发生器</b>产生<b class='flag-5'>正弦波</b>的频率精准调节方法

    三相无刷电机驱动IC BM64071MUV-Z概述

    BM64071MUV-Z是用于三相无刷电机驱动正弦波驱动的预驱动IC,支持48V电源控制外部FET构建的电机驱动
    的头像 发表于 08-05 10:22 1040次阅读
    <b class='flag-5'>三相</b>无刷电机驱动IC BM64071MUV-Z概述

    TI 正弦波发生器电路

    该文档介绍了德州仪器的一款正弦波发生器电路,其设计目标为实现8V/V的交流增益、10kHz的振荡频率,采用±2.5V电源供电;电路通过四通道运放TLV9064缓冲各RC滤波级以生成低失真正弦波
    的头像 发表于 06-23 14:23 2046次阅读
    TI <b class='flag-5'>正弦波</b><b class='flag-5'>发生器</b>电路

    STM32F723ZET6使用ADC捕获标准正弦波并通过USB主动上报,正弦波重新拟合后存在凹陷峰怎么解决?

    内置PHY功能的模拟串口通信把数据上报。上报方式是每次adc采样存下一个点,累计达到1000个点进行一次HS上报。 上位机最好收到的波形如下: 之前通过标准的信号发生器输出1khz正弦波也会存
    发表于 06-20 07:22

    IGBT正弦波调光的工作原理和优势

    IGBT正弦波调光是一种用于调节灯光亮度的设备,其工作原理主要基于IGBT的开关特性和对正弦波信号的控制。
    的头像 发表于 04-11 15:47 2059次阅读
    IGBT<b class='flag-5'>正弦波</b>调光<b class='flag-5'>器</b>的工作原理和优势

    直流无刷电机SPWM正弦波控制原理(可下载)

    等问题,在一些对噪声有要求的应用领域存在局限性。针对这些应用,采用正弦波控制 可以很好的解决这个问题二、直流无刷电机的正弦波控制简介直流无刷电机的正弦波控制即通过
    发表于 03-28 14:19 5次下载

    在AFE5851外接一个正弦波发生器遇到的问题求解

    图1 我在AFE5851外接一个正弦波发生器,频率设置为1MHZ,VPP为1V,按AFE5851的AD转换时间来算,这个频率已能满足要求,可是我在用FPGA中嵌入式逻辑分析仪观测这个正弦波的时候
    发表于 02-14 07:49

    是德33220A 函数任意波形发生器

    *任意波形发生器符合 LXI C 类标准 波形生成 *20 MHz 正弦波和方波 *斜、噪声、带有可变边沿的脉冲生成、直流波形
    的头像 发表于 02-07 15:55 668次阅读

    用信号发生器给8个channel直接灌正弦波,采样值各不相同,这是正常的吗?

    请教大家一个ADS1298的问题: 我用信号发生器给8个channel直接灌正弦波(100HZ,1Vpp,0 offset)。发现采样值各不相同。 这是正常的吗?还是我的ADS1298坏了? 谢谢。
    发表于 02-07 07:46

    ADS8344采集产生的正弦波信号偏置不同时,采集出来的信号各异,为什么?

    测试条件: 供电电压3.3V,参考电压LM385-2.5V,函数信号发生器产生频率为100Hz的正弦波信号,直接由ADS8344采集,当产生的正弦波信号偏置不同时,采集出来的信号各异!!! 采样
    发表于 01-23 06:34

    用DSP28335后接DAC7724产生三相正弦波信号,随负载加重DAC7724的输出受到干扰怎么解决?

    我用DSP28335后接DAC7724产生三相正弦波信号,作为三相逆变器的电压基准。逆变器轻载的时候运行正常,随负载加重DAC7724的输出受到干扰,出现一段负的最大值,如图所示。B、C
    发表于 01-15 08:27

    AN-2199003:ADSP-21990:生成三相正弦波PWM模式

    电子发烧友网站提供《AN-2199003:ADSP-21990:生成三相正弦波PWM模式.pdf》资料免费下载
    发表于 01-14 15:17 0次下载
    AN-2199003:ADSP-21990:生成<b class='flag-5'>三相</b><b class='flag-5'>正弦波</b>PWM模式

    ADS1254信号发生器输出100Hz正弦波,显示的波形中存在有规律的问题,怎么处理?

    ,将读取的数据直接在LabVIEW上显示,信号发生器输出直接接到ADS1254的输入端,幅度0.5V~1.5V,问题如下: 1、信号发生器输出100Hz正弦波,显示的波形中存在有规律的问题: 2、信号
    发表于 01-13 07:48