新手指南:首先设计了与dsPIC33E MCU

新手指南:首先设计了与dsPIC33E MCU

本帖最初发表在预测设计,可以找到原创的文章这里

如果你正在设计一种电子产品,很有可能它会嵌入一个微控制器(MCU)。

为了控制,处理,容易地改变对需求的设计参数和保持设计整洁和相对较低的复杂性,这是不实用的使用纯粹分立的模拟和数字部件接近的溶液。出于这个原因,一个自然的选择是使用微控制器。微控制器基本上是一个计算机收缩到芯片。它包含了一个CPU,存储器,I / O管脚和外设,都在单个封装中。

市场上有许多微控制器的制造商和架构,其中一些是最常见的市场和“学生和爱好者”部门:

  • PIC Microchip的
  • AVR爱特梅尔
  • 8051年从英特尔
  • 来自不同制造商ARM

每个不同类型都有自己的优点和缺点,但在同一时间,他们都可以也非常相似。所以,最后,微控制器的选择归结为应用程序和程序员与MCU的熟悉的细节。

的dsPIC33E

在Arduino之前,微芯片图片是许多爱好者和制造商的选择。它的广泛的社区,便宜的价格和多功能性使它成为嵌入式电子世界中一个非常有吸引力的选择。

随着微控制器变得更加强大,行业从他们要求更多,厂商前来的想法,如用特殊的硬件和功能进行实时数字信号处理集成的MCU。

Microchip的创造了自己的系列,这些器件的施洗他们作为dsPICs。他们整合所有的PIC MCU的众所周知的特征与马力和所需的架构实时进行复杂的数学运算。

他们还创建了一个不错的DSP库,使实现数字滤波器、傅里叶变换和自动增益控制等DSP操作变得更加容易。

在这篇文章中,我们将学习如何让你与dsPIC33E电子设备的第一个设计。本文分为3个部分:

  • 硬件方面的考虑:首先,我们将探索dsPIC33E工作所需的电子组件和连接。
  • 固件配置:这是必要的代码和配置的的dsPIC33E才能运行的需要。
  • 代码示例:我们将查看一些代码,您可以实现这些代码来执行一些基本的和高级的功能。

放弃

所有建议和代码示例都已经通过dsPIC33EP128GP502进行了测试和尝试。如果您正在实现一个不同的设备,请检查它的数据表和产品信息,因为可能有一些微小的差异。

硬件注意事项

在本节中,我们将审查所有必要的连接中的dsPIC33E需要正常工作和执行其他一些设计建议。

基本连接和部件

dsPIC33E需要一些组件和连接,以便它的功能描述在数据表:

这些连接基本上连接的电源,以不同的VDD(逻辑/数字电源)和AVDD(模拟电源)引脚以及所述动力源的所述GND。你的电源可以是5V或3.3V取决于您选择的MCU的,通常为的dsPIC33E的3.3V是常态。

另一个重要方面是在供给和电源引脚之间并联添加电容器。因为他们保持电压稳定在MCU的电源,以免发生故障或因欠压复位事件。这些电容器是非常重要的。

这些电容必须是低ESR,使他们能够快速应对电源变化。一个标准的选择将是一个100nF陶瓷电容器用X7R电介质类型,额定电压高于或等于16V。

该dsPIC33E也有一个内部调节器,使用电容器放置在引脚VCAP的调节。该电容器应为陶瓷低ESR, X7R介电类型,电容至少10uF,额定电压16V以上。

的/ MCLR引脚还需要与10Kohms的到Vdd上拉电阻器连接。该引脚能够若拉低复位了dsPIC33E的。它通常用于编程的dsPIC33E但它也可以被用于重置与另一电路的MCU。

的/ MCLR引脚上的电容器用于保持电压的稳定,所以装置不从电源下降复位。请注意,此电容器只应在制造阶段被放置时的dsPIC33E已经被预编程。

如果你把它和尝试到dsPIC33E程序,它会无法正常工作,电容将形成与电阻器的过滤器和歪曲编程员的指令信号。

PCB布局的技巧

确保所有电容器尽可能靠近Vdd引脚,并与GND直接连接:

编程调试接口

为了编程的dsPIC33E,你需要从MCU到程序员3个的连接要求:/ MCLR,PGEDx和PGECx。

中的dsPIC33E具有了引脚,你可以连接PGEDx和PGECx至少具有3个不同位置的多功能性。

您应该根据在PCB上放置调试连接器的位置选择最好的一对(1、2或3)。

对于这个设计,被选择的PGED3和PGEC3销,因为它们更接近编程连接器。

除了/MCLR、PGEDx和PGECx之外,还需要将Vdd(仅3.3V)和GND添加到编程连接器中。

一种用于在PIC单片机便宜和方便的编程器是PICKit4。您可以从许多网上商店买它,它的成本约50美元。

为了编程接口连接到PICKit4,你可以使用下面的接线图:

ADC针

是您的设备感测的任何模拟信号,诸如音频,温度,电流或电压?如果是这样,您将需要使用ADC。

MCU ADC引脚被标记为对ANx,他们将品尝任何电压你喂它们,从AVDD-AVSS的范围内,这在大多数应用中是VDD-GND或3.3V-0V去。

使用模拟信号时必须谨慎,以确保读数正确,不会使引脚过载。

在ADC引脚前放置RC(电阻+电容)低通滤波器是一种很好的做法。除了滤波不想要的高频信号,电容器提供了一个低阻抗源ADC采样信号和电阻器可以限制任何大电流可能出现的过电压事件。

如果正在测量直流或低频率信号,220ohm-470ohm电阻与值为22nF-47nF的电容器并联应该足够的组合。

外部振荡器

dsPIC33E计数与一个内部振荡器7.37MHz,可以高达70MHz。使用一个内部PLL要使用此振荡器你不需要添加任何额外的硬件。

这个振荡器的+/- 2%的公差是改变主要与温度。这意味着,如果你的应用需要高精确度,当谈到定时或产生的信号,你可能需要考虑增加一个外部振荡器。

这可以通过两种方式实现。

晶体和内部MCU振荡器电路

对于这种配置,4种成分是必需的。晶体,2个电容器和1个电阻器。这些组分应连接以下列方式来销OSC1和OSC2:

为了选择电容器的值,进行如下计算:

C_XTAL = 2 * (Cload-Cstray)

其中Cload是晶体数据表上给出的电容,Cstray是PCB引入的电容,通常在2pF到5pF之间。

确保所选择的电容器为陶瓷NP0 / C0G电介质类型的,并且下一个被放置到晶体。

外部振荡器电路

也许你的电路中有不止一个依赖时钟的集成电路,你希望它们都在同一个时钟上运行,以避免任何时间上的不一致。

如果是这样的话,或者你只是想一个外部振荡器以任何理由,你可以轻松地设计一个然后将其输出连接到OSC1引脚。

过电压保护

MCU是一个相当精致的IC,想想看,它不是一个opamp,它是一个迷你电脑!作为一名设计师,你应该时刻考虑让单片机在“良好的状态”下运行。

什么是良好的条件意思是,你留写在数据表规定的范围之内,远离热源和电力将其与稳定的电源。

避免MCU被煮熟的一个规则是永远不要给它的输入电压大于Vdd。

从MCU一些引脚保护,过压,但他们大多是有瞬态事件。如果你有一个信号比Vdd的大,你需要与MCU的接口它,确保它缩小或限制,可先到达电压。

这可以通过对模拟信号的分压器或对数字信号的齐纳二极管+限流电阻来实现。

内部上拉/下

数字I/O 's可以配置有一个内部上拉/下电阻。

当您需要一个恒定的上/下拉时,这对于节省外部组件非常有用。

例如,如果您的设备出现问题,需要上拉至Vdd的按钮,你可以通过不将外部电阻配置端口为数字输入上拉,这样你省钱和空间。

驱动外部负载

dsPIC33E的I/O引脚可以输入和接收最大5mA,这是不多的。其他的MCU可以做的更多,然而,这通常应该避免。

如果你用MCU驱动一个负载,例如一个LED或光耦,打开这些元件所需的电流会通过dsPIC33E内部电路,因此,在MCU的情况下会发生一些损耗。

最好是有由MCU控制外部晶体管,因此所有的损耗发生外,避免对内部的dsPIC33E电源轨的任何过流保护可能性。

入门固件

在本节中,我们将学习如何使用微芯片工具和软件配置dsPIC33E。然后,一些代码将用于基础和高级应用程序。

编程环境

编程环境只是一个用来写代码和编程/调试单片机软件。在这种情况下,我们会使用MPLAB X,Microchip的软件的PIC系列。

您还需要一个编译器。编译器是代码写入C到十六进制或二进制所以该微控制器能够理解它的线转换的程序。

使编译器成为它自己的产业。有一些付费编译器执行优化,使代码运行更高效,输出文件更小。

在本教程中,我们将使用Microchip的XC16编译器

创建一个新项目

这很简单。只需单击文件>新项目,选择独立项目,单击下一步,并遵循说明。请确保您选择了正确的MCU、调试器工具(如果有的话)和编译器。

MPLAB代码配置

MCC是使生活变得更简单,以新的程序员的目的创建的插件。这使得配置和设置PIC的过程非常简单,因为它可以以图形化的方式来完成。然后该程序生成的代码,并将其导入到项目中。

值得一说的是这个插件是不完美的,有时你会有微调和配置寄存器直接,但是,它确实大部分配置没有问题。

要检查您是否安装了MCC,请进入Tools>Plugins并寻找MPLAB代码配置器。如果它被安装和激活,你应该在上面的工具栏上看到这个符号来打开它:<我mg loading="lazy" alt="" width="40" height="35" data-src="//www.millseast.com/wp-content/uploads/2019/01/MCC.png" class="aligncenter size-full wp-image-1970 lazyload" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==">

MCC分为多个模块。系统模块和外设模块。

系统模块控制时钟频率,编程引脚,全局中断和I / O引脚。这些模块不是可有可无的,他们需要配置或中的dsPIC33E将无法正常工作。

可以根据应用程序的需要激活和停用所有其他外设模块

系统模块

打开MCC时出现的第一个窗口是系统模块。我们将使用这个窗口来设置时钟频率,编程引脚和看门狗定时器。

  1. 选择您的时钟源
  2. 使用postcaler和PLL设置MCU时钟的最终频率。在FOSC / 2的值将是您最终的时钟值。
  3. 点击能时钟切换。这是安全功能用于主时钟源失效。我发现,如果它不是那么激活固件将无法正常工作。
  4. 根据您的原理图中选择程序(ICD)引脚组

销模块

引脚模块是一个非常灵活的方式将功能分配到各引脚。

还有一个窗口,让你看到的是你的脚所在的位置在MCU物理包,如果它是可用的,并且它被分配。

使用这个窗口来设置你的I/O引脚,并声明如果他们是输入,输出或模拟。添加一个名称来告诉您信号是什么也是好的。您还可以通过检查WPU/WPD来添加上拉/下拉。

未使用的I / O引脚

这是正常的留下一些未使用的针在你的设计。当在这种情况下,将它们配置为输出,并驱动到低(默认设置)

定时器模块

TMR1上双击设备资源窗口此模块添加到您的配置。

通过修改时钟源和分频器,定时器可以计数更长或更短。

如果你需要一个定时器计数小于5ms,然后选择在模块配置看出,有超过5毫秒的最大定时器周期的预分频器值。

然后,在定时器周期选项键入5毫秒和MCC将寄存器自动设置为5毫秒的正确的值。

ADC模块

双击Device Resources窗口上的ADC1,将此模块添加到配置中。

通过指定TCY值选择ADC转换时钟。这是ADC才能使一个转换的时间。如果您选择的值太低,MCC会给你一个警告。只要确保该值低于警戒值越大。

此外,为了便于实施,并作出表示在后面的工作示例代码,选择自动取样和相同的转换触发的形象。

编程MCU

配置系统模块和外围设备模块后,点击生成以创建所有的配置文件。

然后,进入项目(略高于项目资源),打开源文件夹树透露main.c文件。在这里,你会写你的应用程序代码。

一旦你完成了你的代码,点击清理并生成图标(扫帚,锤子),以验证该编译器可以将你的代码(你可能会得到错误,如果它是你的第一次)。

好的方面是,编译器会告诉您错误在哪里,以及有时如何修复它,请检查在单击Clean和Build时出现的构建窗口。

一旦你的代码被编译,您可以点击Make和计划设备(图标旁边玩)上传代码到MCU。

在这样做时,请确保您的PICKit4连接到设备,计算机和设备已通电。

调试

一个使用PIC和MPLABX相比到Arduino和Arduino的IDE的主要优点是,您可以访问调试工具。

在Arduino的,当你想怎么看变量的变化,您通常需要使用串口监视器的代码的特定部分来显示变量。

你不能停止的代码,做一步步执行,也没有办法知道多久代码执行已经采取。

当您必须确定您的程序为什么不能工作时,所有这些提到的特性都非常有用。

启动调试。与前面一样,将硬件与PICKit4连接起来,然后单击调试按钮(最右边带有小play符号的按钮)。

逐步遍历代码

一旦在调试模式下对MCU进行编程,以下按钮将可用:

您可以使用播放/暂停按钮来启动/停止执行代码和复位,开始从一开始的代码。停止按钮将终止调试会话。

其他按钮用于单步执行代码。

  • 步进:步进一个子例程,然后转到下一行代码
  • Step Into:进入子例程并进入下一行代码
  • 步出:去一个子程序,还常去的下一行代码
  • 运行到光标:运行程序到你离开光标的地方

另一种方式来控制程序流是通过设置断点。他们到达时,断点会自动暂停该计划。

要设置断点,请点击这里显示的行号的行。一个红色的小盒子应该是可见的

观察变量

要在监视窗口中添加一个变量,只需右键单击该变量并单击New watch。每次您暂停程序流时,变量窗口将更新,并以红色显示已更改的变量。

默认情况下,它会告诉你在十六进制变量的值。要改变这一点,只需右键点击值和小数选择节目。

秒表

秒表对于确定执行代码段所花费的时间非常有用。

例如,如果希望检查delay_ms子例程是否在工作,可以计算从子例程开始到结束所花费的时间。秒表显示时钟周期的时间:

要将周期转换为时间,只需将周期除以时钟频率。例如,对于一个周期计数210471196,在一个40MHz系统时钟上执行所有这些周期所花费的时间是210471196/40000000 = 5.26秒。

代码示例

下面的例子将帮助您开始使用一些基本的和高级的功能。

数字I / O的读/写

MPLAB代码配置器自动创建一些子程序读/写I / O引脚。

假设您有一个引脚设置为名称继电器的输出

RELAY_SetLow( ) ; //设置销到0V或逻辑低

RELAY_SetHigh( ) ; //将pin设置为Vdd或逻辑电平高

假设你有一个引脚设置为与名称键输入

布尔readButton( 空虚 ) //读取外部按钮状态
{
bool buttonState= 0 ;
buttonState=BUTTON_GetValue( ) ;
返回buttonState
}

Delay_ms

下面的子例程创建使用TMR1毫秒的延迟。此代码假定你已经配置TMR1在1ms的溢出。

空虚delay_ms( INT延迟)
{
INT= 0 ;
布尔statusTimer1= 0 ;
TMR1_Stop( ) ;
对于 (= 0 ;<延迟;++ )
{
TMR1_Start( ) ;
IFS0bits。T1IF = ; //清除中断标志
(statusTimer1= = )
{
TMR1_Tasks_16BitOperation( ) ;
statusTimer1=TMR1_GetElapsedThenClear( ) ;
}
TMR1_Stop( ) ;
statusTimer1= 0 ;
}
}

简单的ADC读

这个子程序可以用于单个ADC读数。假定和ADC通道命名为“ADC_pin”与MCC销模块:

INTreadADC( 空虚 )
{
INTADCval= 0 ;
ADC1_ChannelSelectSet(ADC1_ADC_pin) ;
ADC1_SamplingStop( ) ;
( !ADC1_IsConversionComplete( ) ) { }
ADCval=ADC1_Channel0ConversionResultGet( ) ;
返回ADCval;
}

DSP库:一个音频信号的FFT

下面是一个使用了dsPIC33E的DSP功能更复杂的subrotuine。

下面是所有必要的代码,包括需要声明的变量。要使这段代码工作,您需要包含dsPIC33E DSP库中的DSP .h头文件旋转因子的FFT到项目中。这是通过添加文件到同一文件夹树main.c文件来完成。

此外,您还需要配置符号小数数据类型的ADC输出结果此代码工作。

的#include dsp.h

定义FFT_BLOCK_LENGTH在FFT中的频率点的数量
的#define LOG2_BLOCK_LENGTH 10 //在FFT处理“蝴蝶”阶段应该与FFT_BLOCK如在2 ^ 9 = 512号
定义audio_fs44100 //麦克风捕获的音频信号的采样频率

int16_tpeakFrequencyBin;
uint16_tix_MicADCbuff;
uint16_tpeakFrequency;

走读生 常量,,计算结果丢twiddleFactors(FFT_BLOCK_LENGTH/ 2 ]使用__attribute__( (空间(使用auto_psv) ,对齐(FFT_BLOCK_LENGTH* 2 ) ) ) ;

,,计算结果丢sigCmpx(FFT_BLOCK_LENGTH]使用__attribute__( (部分( “.ydata,数据,ymemory” 却 ) ,对齐(FFT_BLOCK_LENGTH* 2 * 2 ) ) ) = { { 0 } } ;

空虚readMic( 空虚 ) / /样本麦克风输入
{
ADC1_ChannelSelectSet(ADC1_AI_MIC) ;
ix_MicADCbuff= 0 ;
对于 (ix_MicADCbuff= 0 ;ix_MicADCbuff<;FFT_BLOCK_LENGTH;ix_MicADCbuff++ )
{
//插入延时子程序这里
ADC1_SamplingStop( ) ;
( !ADC1_IsConversionComplete( ) ) { }
sigCmpx(ix_MicADCbuff]真实 =ADC1_Channel0ConversionResultGet( ) ;
sigCmpx(ix_MicADCbuff]图像放大 = 0 ;
}
}

空虚signalFreq( 空虚 ) //检测由麦克风拾取声音的主频率
{
readMic( ) ;
FFTComplexIP(LOG2_BLOCK_LENGTH, &功放;sigCmpx( 0 ] , (,,计算结果丢* )__builtin_psvoffset( &功放;twiddleFactors( 0 ] ) , ( INT )__builtin_psvpage( &功放;twiddleFactors( 0 ] ) ) ; //执行FFT运算
BitReverseComplex的(LOG2_BLOCK_LENGTH, &功放;sigCmpx( 0 ] ) ; //在他们的地址倒序店输出样本
SquareMagnitudeCplx(FFT_BLOCK_LENGTH, &功放;sigCmpx( 0 ] , &功放;sigCmpx( 0 ]真实 ) ; //计算复数FFT输出阵列的平方量值,所以我们有一个真正的输出向量
VectorMax时(FFT_BLOCK_LENGTH/ 2 , &功放;sigCmpx( 0 ]真实 , &功放;peakFrequencyBin) ; //查找具有最大能量的频率库(=索引到SigCmpx[]数组)
peakFrequency=peakFrequencyBin* (AUDIO_FS/FFT_BLOCK_LENGTH) ; //计算频率(Hz)最大频谱分量的
}

保存到闪存

通常,当电力从嵌入式设备移除,所有的数据将丢失,除了所述一个保存在闪存中。

它是非常有用的数据保存在闪存上,所以当该设备是无动力的,这些值可以在以后进行还原。

下面的子程序可以让您存储多达上了dsPIC33E闪存128个变量。

您需要下载rtsp_api.h和rtsp_api.s库从Microchip,并包括他们在您的项目中为这个子例程工作。

#包括“rtsp_api.h”

的#define ROWLENGHT(128)
的#define PAGE_MIRROR_LEN(128 * 8)

int16_tpageMirrorBuff(PAGE_MIRROR_LEN] ;
int16_t温度;
uint16_t变量1;
uint16_t变量2;
uint16_tvariable3;
uint16_tnvmAdr,nvmAdru,nvmAdrPageAligned,nvmRow,nvmSize,nvmOffset;

int16_ti参数(ROWLENGHT]使用__attribute__( (空间(掠夺) ,地址( 为0x1000 ) ) ) ;

空虚initRTSP( 空虚 ) //仅在设备初始化时调用此子程序一次
{
nvmAdru=__builtin_tblpage( &功放;i参数( 0 ] ) ;
nvmAdr=__builtin_tbloffset( &功放;i参数( 0 ] ) ;
nvmAdrPageAligned=nvmAdr&功放; 0xF800 ; //获取Flash页对齐的地址
nvmRow= ( (nvmAdr&GT; &GT; 7 ) &功放; 7 ) ; //排在页面
nvmSize=ROWLENGHT;
nvmOffset= 8 ;
}

空虚readFlashPage( 空虚 )
{
温度=FlashPageRead(nvmAdru,nvmAdrPageAligned,pageMirrorBuff) ;
}

空虚updateRamBuffer( 空虚 )
{
i参数( 0 ] =变量1;
i参数( 1 ] =变量2;
i参数( 2 ] =variable3;
温度=FlashPageModify(nvmRow,nvmSize,i参数,pageMirrorBuff) ;
}

空虚eraseRamBuffer( 空虚 )
{
i参数( 0 ] = 0 ;
i参数( 1 ] = 0 ;
i参数( 2 ] = 0 ;
温度=FlashPageModify(nvmRow,nvmSize,i参数,pageMirrorBuff) ;
}

空虚eraseFlashPage( 空虚 )
{
温度=FlashPageErase(nvmAdru,nvmAdrPageAligned) ;
}

空虚rowFlashWrite( 空虚 )
{
int16_t;
温度=FlashPageWrite(nvmAdru,nvmAdrPageAligned,pageMirrorBuff) ;
对于 (= 0 ;&LT; (PAGE_MIRROR_LEN) ;++ ) //清除页镜像缓冲器
{
pageMirrorBuff(] = 0 ;
}
}

空虚程序参数( 空虚 ) //调用这个子程序写入到闪存新值
{
updateRamBuffer( ) ;
eraseFlashPage( ) ;
rowFlashWrite( ) ;
}

空虚eraseParameters( 空虚 ) //调用此子程序来擦除闪存的值
{
readFlashPage( ) ;
eraseRamBuffer( ) ;
eraseFlashPage( ) ;
rowFlashWrite( ) ;
}

一锤定音

在这个初学者指南中,我们介绍了开始使用dsPIC33E所需的所有内容。

你已经学会了MCU工作所需的基本硬件连接和电子元器件。

您还学习了如何使用MPLAB代码配置器来设置dsPIC33E的不同设置和参数。

最后,你已经展示了如何编程和调试MCU和一些基本的子程序来帮助你开始。

如果您有任何疑问,请随时与我联系info@www.millseast.com188金宝搏官网注册账号

罗伯托·韦泽

罗伯托在电子嵌入式系统设计经验,从概念到节目生产,包括:电力电子,音响电子,汽车,电池管理系统和可再生能源控制系统。罗伯托感兴趣的技术和可持续发展,而他在他的大学学历,硕士,外部课程,获得安置的实践经验,也从志愿秘鲁。此外罗伯托为商务,领导能力和团队合作能力,从他的时间作为拉美裔主席,西班牙社会和驻场DJ在普利茅斯

发表评论