Questions tagged «microcontroller»

紧密耦合的独立设备中包括中央处理器(CPU),内存和(通常)各种I / O外设(UART,ADC,DAC,通用I / O,I2C等)的设备包。

3
微控制器PCB布局的详细信息
更新:后续问题显示了我对最终PCB布局的看法。 我正在用uC布置我的第一块电路板(我在使用和编程嵌入式系统方面有相当丰富的经验,但这是我第一次进行PCB布局),这是STM32F103,这将是混合信号板同时使用STM的内部DAC和一些通过SPI的外部DAC,我对接地有些困惑。 这些问题的答案: 去耦帽,PCB布局 竞争PCB晶体布局建议 PSoC的混合信号PCB布局 明确指出,我应该有一个用于uC的局部接地平面,该接地平面恰好在一个点处连接到全局接地,并且在该点附近具有一个局部电源网,该局部电源网连接到全局电源。这就是我正在做的。然后,我的4层堆栈是: 本地GND平面+信号,uC,它是100nF的去耦电容和晶体 全局GND,通孔除外。根据亨利·奥特(Henry Ott)这样的消息来源,地平面是未分割的,数字部分和模拟部分实际上是分开的。 电源,IC下的3.3V平面,用于3.3V外部DAC的粗线,用于在模拟部分分配伏的。± 15±15\pm15 信号+ 1uF去耦电容 在板上更远处,模拟组件和信号位于顶层和底层。 所以问题: 我应该在uC之下突破全球范围,还是将完整的地面平面置于本地之下? 电源平面:我打算仅在uC下使用电源平面,并使用过孔将电源带到去耦电容,并因此将uC带到顶层,因为在其他地方我不能真正使用太多电源。外部DAC应该是星形分布的,因此我为它们设置了单独的走线,电路板上的其余部分为伏。听起来还好吗?± 15±15\pm15 我同时使用uC的ADC和DAC,并在电路板的模拟部分中生成参考电压,然后将其带到uC的Vref +引脚上,并在电源板上进行跟踪。我应该在哪里连接Vref-引脚:局部接地,全局接地,或在电源平面上建立一条单独的走线,以将其连接至模拟部分中的全局接地,接地应保持安静?也许靠近参考电压产生的地方?请注意,在STM32上,Vref-与模拟接地VSSA引脚不同(我认为它会到达本地GND平面?)。 当然,这里对设计的任何其他评论也欢迎!

2
内置闪存容量不足
我在我的项目之一中使用了德州仪器的TM4C1230C3PMI控制器。它具有32KB的内部闪存,不足以满足我的应用程序的需要。市场上有更高闪存大小的微控制器可以使用,但我只想使用该微控制器。据我所知,可以使用外部EEPROM来增加总闪存大小(程序存储器)。 我的想法是正确的吗? 如果不是,请建议如何增加控制器的总闪存容量?

4
我应该多久查询一次RTC?
我尚未使用RTC,因此我不太确定读取实时时钟的“正常”方式。我曾想过几种不同的方法,但希望对此有所建议。 到目前为止,以下是我想到的阅读和使用时间的方法: 获取开机时的日期和时间并保存到RAM,然后通过使用计时器中断每秒增加RAM值等。然后,只要需要知道日期/时间,代码就会使用RAM中的值。 通过使用计时器中断,每秒查询RTC并将接收到的日期和时间复制到RAM。同样,该代码将在需要知道日期/时间时使用RAM中的值。 每当我需要找出时间时,查询RTC并直接使用它的响应。 哪种方法最好?

1
MSP430的历史
这个问题今天让我大吃一惊。 MSP430的历史是什么?它从什么时候开始的,它是由什么演变而来的,为什么产生了它(即,它试图达到什么目标/试图解决当前uC的技术限制),为什么将其称为“ MSP430”? 互联网搜索仅显示了此要点,并没有多说。

3
该电路如何将20V信号与3v3微控制器接口
我设计了以下电路,以将12-20V信号连接到运行3.3伏特的微控制器。信号为20V或开路。 我希望电路尽可能具有弹性。它应该能够处理EMI和ESD。 R1用于限制电流并使晶体管偏置。 C1用于实现低通滤波器。 R2用于下拉晶体管基极并使电容器C1放电,20V输入为20V或开路。 D1用于保护晶体管不受基极负电压的影响。 R3上拉微控制器引脚。 欢迎对此电路进行任何评论和改进。 附带的问题:该晶体管可以承受的最大正电压是多少。数据表中规定峰值基极电流为100mA。如果基极保持在0.7伏,则输入可以高达1000伏(10k欧姆* 100mA)。但是,如果输入为1000伏,则分压器会将电压设为500伏。根据数据表,最大Vcb为60V。

4
AVR闪存损坏
这个问题与AVR的解码本身有关。 项目信息: 我们有一个使用ATMEGA644P的电池供电产品。该应用程序永久以睡眠模式运行,并且仅每秒唤醒一次(RTC)或触发两个外部中断线之一。 该器件具有一个非常简单的引导加载程序,该引导加载程序通过UART(使用RS232接口IC)进行通信。它只是一种方便的方法来更新固件,因此不需要硬件ISP编程器。(引导加载程序需要校验和安全的电报) 该设备设计为具有内部掉电禁用功能,因为它使功耗加倍,并且必须延长电池寿命(我猜应该使用外部掉电检测-重新设计正在进行中)。 问题: 每隔一个月设备就会停止工作,这些设备上不会执行固件更新。但是,在进一步检查之后,这些设备的闪存内容似乎已损坏。此外,其中一些设备的电池仍然不错,但我不想排除某些欠压情况。 这是原始闪存内容(左)与损坏的内容(右)的比较: 一些观察: 损坏的块始终至少包含一个闪存页面(256字节),并且是页面对齐的。换句话说:仅影响整个页面,不影响单个字节。 损坏的内容大部分时间读为0xFF,但也可能包含其他值或完全是“随机”的。 图像左侧的小条显示了所有受影响的区域。对于此设备,它大约占闪存总内容的十分之一。 我们有一台只影响单个页面的设备。 完全有理由认为,在写入闪存时出现欠压情况会损坏闪存内容。但是,这意味着必须执行一些闪存敏感指令。 可能是由于欠压导致控制器随机重启,并且引导加载程序代码在此期间的行为完全不可预测。引用另一个论坛中有关欠电压的消息: “不仅会执行闪存中的随机指令,而且还会执行随机的指令周期(不能保证闪存中的代码会正确读取和解释)。与此同时,单片机的其他部分可能无法按设计运行,包括保护机制。” 问题: 您是否认为“电压不足并执行某些指令以更改闪存页面中的数据期间的随机行为” -解释是否合理?如果真是这样,为什么我们一直没有看到这种错误,只是一些软件问题(堆栈溢出,无效的指针)的原因。 您还有其他想法会导致这种腐败吗?这可能是由EMI / ESD引起的吗?

3
BJT与(MOS)FET切换微控制器的负载
我想知道选择双极结晶体管(BJT)与场效应晶体管(FET)(MOSFET或JFET)来切换微控制器负载的原因是什么。在我们的假设情况下,假设负载需要的电流超过微控制器可以提供的电流,并且问题是,在不考虑“易用性”的情况下,哪些考虑因素会偏向于或不利于BJT和FET开关设计。 这个问题是何时使用什么晶体管问题的更具体的版本 。

1
微控制器内部弱上拉和EMI敏感性
在微控制器上使用弱内部上拉电阻(100k)时,我会遇到哪些不利条件?我想知道在这些弱上拉的情况下,敏感线(仅具有寄生走线/组件电容)如何受到EMI瞬变的影响。 具有3-4ms窗口的数字滤波可以降低产生瞬变的几率,但是在专业PCB上还有其他需要注意的地方吗?

3
单片机睡眠竞赛条件
给定一个运行以下代码的微控制器: volatile bool has_flag = false; void interrupt(void) //called when an interrupt is received { clear_interrupt_flag(); //clear interrupt flag has_flag = true; //signal that we have an interrupt to process } int main() { while(1) { if(has_flag) //if we had an interrupt { has_flag = false; //clear the interrupt flag …

1
Cortex M0真的是低功耗吗?
我正在使用NXP LPC1100系列CPU,这是他们功耗最低的Cortex M0产品。但是,在数据表中指出,在最佳条件下(休眠模式+禁用所有外围设备),它仍然使用6 mA电流,我的测量结果证实了这一点。 我的智能手机(具有1Ghz CPU和许多活动外围设备)在待机状态下如何才能使用3 mA电流,而这款48Mhz Cortex甚至在不活动时也会使用更多电流?


2
选择32 kHz晶振的负载电容值
在我正在研究的设计中,我需要一些帮助来选择32.768 kHz XTAL的负载电容器。 这有点长,但是主要的问题是:正确确定负载上限值是否至关重要,以及走线和引线的寄生电容在确定这一点上有多重要。 我的设备使用TI CC1111 SoC,并且基于TI提供的USB加密狗的参考设计。CC1111需要48 MHz高速(HS)振荡器和32 kHz低速(LS)振荡器。参考设计将晶体用于HS振荡器,并将内部RC电路用于LS振荡器。但是,CC11111可以连接到32.768 kHz的晶体振荡器,以获得更高的精度,这是我所需要的。 CC1111 数据手册提供了一个公式(第36页),用于选择负载电容器的值。为了进行完整性检查,我使用该公式来计算参考设计中与48 MHz xtal一起使用的电容值。我认为我应该得到与设计中实际使用的大致相同的数字。但是我得出的电容值与TI使用的电容值不匹配,因此我有点担心。 我的侦查细节如下,但总而言之,48 MHz晶振的数据表说它需要18pF的负载电容。参考设计中使用的两个负载电容器均为22 pF。CC1111数据表中的公式将xtal引线上的负载电容与负载电容器(和C b)的值相关联CaCaC_aCbCbC_b Cload=11Ca+1Cb+CparasiticCload=11Ca+1Cb+CparasiticC_{load} = \frac{1}{\frac{1}{C_a} + \frac{1}{C_b}} + C_{parasitic} CloadCloadC_{load}CaCaC_aCbCbC_bCparasiticCparasiticC_{parasitic}CaCaC_aCbCbC_b 或者,根据TI应用笔记AN100, Cload=C′1×C′2C′1+C′2,Cload=C1′×C2′C1′+C2′,C_{load} = \frac{C_1' \times C_2'}{C_1' + C_2'}, C′xCx′C_x'CxCxC_x C1C1C_1C2C2C_2C′1C1′C_1' 我之所以这么问,是因为担心如果我选择了错误的负载电容器值,它将无法正常工作,或者频率将是错误的。这些类型的晶体对加载上限值有多敏感? 我的侦查细节: 从参考设计zip文件中包含的Partlist.rep(BOM)中,晶体(X2)和与其连接的两个负载电容器(C203,C214)为: X2 Crystal, ceramic SMD 4x2.5mX_48.000/20/35/20/18 C203 Capacitor 0402 C_22P_0402_NP0_J_50 C214 Capacitor …

4
带有微控制器的数字调光器
我想为电阻负载建立一个数字调光器。我为此找到了这个电路: 输入电压为220VAC 50Hz。 图片中的红色框为Zero Crossing Detection。 当交流电压过零时,微控制器将被中断,因此将检测到过零。因此您可以通过Triac在特定时间后触发来达到所需的电压Delay。您是否推荐此电路?如果是这样,请让我知道是否有任何IC要替换为Red Box(如图所示)以检测交流电压的零点(因为我的电路应尽可能小)? PS:由于我需要该电路来减少负载的能耗,因此电路本身必须消耗最多5瓦的功率。

6
如何有效地解码非标准串行信号
我是研究团队的一名本科生,从事一个涉及RF传输ASIC及其无线接收器的项目,该无线接收器最终应将数据发送到PC。 接收器输出快速,连续,异步的非标准串行信号(即非SPI,I2C,UART等),因此我的工作是编写微控制器软件以将接收器连接到计算机。当前,我的方法是使用边沿触发的中断将数据放置在循环缓冲区中,并在主循环中执行整个逐位解码过程。微控制器必须同时使用USB(虚拟com端口)将此数据输出到计算机。 这是我遇到的一个问题,也是我预期的一个问题: 即使使用强大的72 MHz ARM Cortex M3处理器,我也无法足够快地处理缓冲的数据。比特率是400 Kbps(2.5 us / bit)。作为参考,每位仅保留180个周期(包括解码和ISR,它具有约30个周期的开销!)。MCU还必须处理在主循环中轮询的许多其他任务。 USB虚拟com端口驱动程序也是基于中断的。这使我几乎可以肯定,驱动程序最终将中断处理器的时间如此之久,以致于错过了可能会传输位的2.5微秒(180周期)窗口。我不确定通常如何解决此类中断冲突/竞赛。 所以问题很简单,一个人可以做什么来解决这些问题,或者这根本不是正确的方法吗?我也愿意考虑减少以软件为中心的方法。例如,使用带有某种硬件状态机的专用USB芯片进行解码,但这并不熟悉。

6
我的PIC16多任务RTOS内核不工作的原因是什么?
我正在尝试为PIC x16微控制器创建一个半抢占式(协作式)RTOS。在我之前的问题中,我了解到在这些内核中无法访问硬件堆栈指针。我在PIClist中查看了此页面,这就是我正在尝试使用C实现的页面。 我的编译器是Microchip XC8,当前正在使用在配置位中选择了4MHz内部RC振荡器的PIC16F616。 我了解到,可以通过查看编译器的头文件来使用C访问PCLATH和PCL寄存器。因此,我尝试实现一个简单的任务切换器。 如果我在重新启动,重置并在光标不在第一行(TRISA=0;)而不是另一行(例如ANSEL=0;)上时将调试器设置为光标后暂停调试器,则它可以在调试器中正常工作。在调试器的第一次启动中,我在以下位置获得这些消息Debugger Console: Launching Programming target User program running No source code lines were found at current PC 0x204 编辑:我不知道是什么使它起作用,但是调试器现在可以完美地工作了。因此,省略上面的输出和段落。 编辑:更改这样的主要定义使下面的代码工作。这将在程序地址处启动主要功能0x0099。我不知道是什么原因造成的。这不是一个真正的解决方案。我现在猜测存在编译器特定的错误。 void main(void) @ 0x0099 { 这是我的C代码: /* * File: main.c * Author: abdullah * * Created on 10 Haziran 2012 Pazar, 14:43 */ #include <xc.h> …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.