Questions tagged «microcontroller»

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

1
如何从STM32F103C8T6板开始?
几年来,我一直在使用8位AVR MCU与学生一起构建线跟随机器人。现在,我想使用ARM Cortex-M3,因为我想添加一些更多的CPU密集型功能,例如里程表和传感器融合。 要求是: 8个模拟输入, 4个PWM输出 我2 C 2个正交编码器输入, 串行I / O, 无线自编程,无需物理访问机器人。 多平台工具链+ IDE(OS X,Linux,Windows)。 到目前为止,我已采取的步骤是: 我正在使用基于STM32F103C8的电路板。我相信该MCU具有我所需的一切,包括我计划在软件中实现的2 x QEI,但是这个恰好在硬件中具有,所以很棒: 董事会http://eud.dx.com/product/high-quality-cortex-m3-stm32-stm32f103c8t6-development-board-w-swd-interface-844380789 程序员http://eud.dx.com/product/st-link-v2-programmer-emulator-mini-stlink-downloader-for-stm8-stm32-mcu-development-board-844380733 我遵循此步骤来设置我的工具链+ IDE: http://www.davidrojas.co.uk/stm32f3discovery-on-mac-os-x-using-eclipse-gcc-arm-and-openocd/ 我发现该芯片的文档分散在许多PDF中,这些PDF是我下载的: STM32F103x8数据表http://www.st.com/st-web-ui/static/active/zh/resource/technical/document/datasheet/CD00161566.pdf 参考手册http://www.st.com/st-web-ui/static/active/en/resource/technical/document/reference_manual/CD00171190.pdf 我将来可能会需要一些其他文档,例如AN2606(内存启动模式),PM0075(闪存编程手册)和AN3155(串行启动加载程序协议)。 我还下载了STM32F10x标准外围设备库,但这反过来又建议我购买较新的STM32CubeF1,我相信这只是上述产品的市场重命名,因此我同时获得了两者: http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/LN1939/PF257890 http://www.st.com/web/zh/catalog/tools/PF260820 最后,我还收到了Joseph Yiu撰写的“ ARM Cortex-M3权威指南”,我在等这些板到达时正在阅读。 我的问题是: 至少可以说,我对文档有点不知所措,而且我甚至不确定我是否掌握了全部内容。例如,数据表和参考手册指出该芯片具有3个能够正交编码输入的定时器。但是,我无法在上述PDF的任何地方找到控制定时器的寄存器的文档。我想念什么? 我应该使用(较旧?)标准外围设备库还是(较新?)多维数据集?有什么不同?我知道这两个库都使我免于直接操作寄存器,这是推荐的方法。我对吗? 库的文档在哪里(除了嵌入式doxygen注释之外,这些注释很好,除了我自己,我宁愿拥有可搜索的html / pdf)? 我选择Eclipse + GCC ARM + OpenOCD作为我的工具链,因为我认为这是唯一可以在3个主要OS上运行且没有代码大小或其他限制的选项。还有其他选择吗?

8
每个微控制器线都有自己的编程语言/语法吗?
我已经对Arduino进行了编程,并开始对Teensy进行编程。它们类似于C,但是在编程语言中有细微差别。 例如,在Arduino C中,您调用了一个功能pinMode(pin#,Output / Input)来指定一个数字引脚以输出信号或接收信号。在Teensy的C语言中,设置与四个端口之一(每个端口代表一组引脚)相关联的“ DDR”寄存器,这些端口统称为输入或输出(Teensy IO语法)。 我想知道当您使用新的微控制器时,您需要有效地学习一种新的“语言”。我将“语言”一词用引号引起来,因为尽管语法上有细微差别,但组件及其在软件中的设置方式基本上是等效的,例如,端口和引脚的概念仍指的是您可以从中输出/输入数字的端子信号。 同样徒劳的是:是否存在未在软件中进行编程的微控制器,或者将始终存在用于对uController进行编程的软件层?如果是后者,谁为他们编写/提供文档?

2
将两个MCU引脚直接直接连接是否安全?
我正在一个MSP430项目上工作,该项目需要我将一个外设的输出路由到另一个外设的输入。因此,我有两个直接相互连接的MCU引脚。这对我来说似乎很可疑,因为有可能发生编程错误,导致两者都是(可能是冲突的)输出。另外,还有启动和编程状态的问题。 在最坏的情况下,如果一个引脚驱动HI,而另一个引脚驱动LO,则GPIO引脚通常具有比源能力更大的吸收能力……因此,这有点像获取HI输出并将其短路至接近–地面。哪个不好...但是有多糟糕?可能会损坏MCU吗? 我经常在人们的网上看到使用Arduino在不带电阻的情况下在两个引脚之间点亮LED的示例,而且我没有听说有人油炸LED以外的任何东西。显然,您不想在产品中这样做,但是制造商是否通常会尝试保护MCU免受GPIO引脚过载的影响? 回想起来,在两个引脚之间放置一个限流电阻器可以避免任何麻烦,但是即使是很小的硬件更改,在这一点上也是一件非常困难的事情。 为了以后的参考和后代的利益,对于将两个MCU引脚连接在一起的风险最小化的正确方法,还有其他人是否有任何其他想法,更普遍地说,是将GPIO引脚过载的风险最小化的正确方法?

2
减少由小型直流电风扇引起的电噪声
有什么方法可以减少/消除小型无刷直流风扇在ADC中产生的电气噪声?对于低于参考,我还使用这壁疣和这个 5V线性稳压器。 我的基准系统如下所示: 我头脑中有些选择,我想知道最好的选择是什么。 我的第一个想法是[选项A]: 我的第二个想法是[选项B]: 我的第三个想法是[选项C]: 我可能没有想到过其他选项,以及这些选项的排列和组合。这些选择的优缺点是什么?您会选择什么选项,为什么?

4
使共享总线充当OR
如果您不耐烦,可以跳过背景。 背景 我正在编程一组与SPI通信的微控制器。有一个主n从共享总线。没有芯片选择。(这不是一个不好的设计,但是n很大,没有足够的空间容纳n多余的行)。 因此,从站有责任保持其MISO处于高阻抗状态,并且最多只有其中一个发言。通过仅在轮询其ID时进行响应才能完成此操作。 现在,我们希望有一个初始发现阶段,在此阶段,主节点会发现附加了ID的从节点。为了使生活更轻松(在某些方面),我们希望具有唯一的ID(因此,例如32位)。这样,主机就不可能简单地逐个轮询id并查看谁做出响应(存在太多可能性)。 为了解决这个问题,我设计了一种二进制搜索的变体,其中从站集体响应,而主站能够快速找到最小id。告知具有该ID的从站不再参与,算法重复执行。(细节不重要)。 不过有一个问题。集体响应必须是所有响应的逻辑或(或逻辑与)。有人告诉我,可以以MISO总线可以用作逻辑OR的方式配置线路。有人告诉我: 将主机上的MISO设置为上拉和 将每个从机上的MISO设置为漏极开路。 我已经尝试过了,但是即使只有一个从机,此配置也无法工作(示波器在行上显示恒定的零)。如果我在主设备上将MISO配置为高阻抗输入,则在示波器上可以看到电压下降到一半,这是两个从设备的输出位不同的地方(我认为基本上是短路)。 注意:在主机上将MISO配置为高阻抗,在从机上将其配置为推挽,即使同一总线上有许多MISO,我也可以分别与它们交谈。我的意思是,我怀疑这是生产线本身的问题。 题 我的问题是,是否完全可能,如果可以,如何配置主机和从机的输入和输出引脚,以使共享的MISO线充当逻辑或(或逻辑与)? 编辑 原来,它变成了具有负真逻辑(基本上是AND)的OR。 通过将1写入主机上的上拉引脚,可以解决单个从机的问题。以前它的初始状态为0。 编辑2 事实证明,ST从机将我的MISO GPIO配置改写为漏极开路,并在写入时强制将其拉高。我决定在这种特殊情况下手动使SPI静默并输出MISO。

3
控制理论如何应用于我的实际处理器控制的升压转换器?
我对控制理论的了解有限。我在学校处理零极点和转移函数。我已经为DC / DC转换器实现了几种基于微处理器的控制方案。这两件事如何相互关联,我还想弄清楚,我很想知道。以反复试验为基础的设计是可行的,但我更希望对自己在做什么以及后果有更深入的了解。 答案应该集中在如何分析系统上,而不是在如何改进它上。就是说,如果您有改进系统的建议,并希望给出分析原因,那就太好了!只要改进是分析的第二要务。 对于这个问题,我的示例系统是: C1:1000uF C2:500uF L1:500 uH 开关频率:4 kHz R1:可变 输入电压:400伏 输出电压目标:500伏 输出电流限制:20安培 我正在尝试调节输出电压,而不超过输出电流限制。我具有电压和电流检测功能,这些电压和电流检测功能经过各个放大阶段,目前还没有进行分析,但确实包含一些滤波功能。随后是直接在A / D转换器上的100欧姆和1000 pF的RC低通滤波器。A / D采样率为12 kHz。该值通过最后64个采样的单极IIR移动平均滤波器。 之后,我有两个PI循环。首先,电压环路。以下是伪代码,其值缩放为伏特,毫安和纳秒。假设边界检查在其他地方正确实现。如果没有积分项,这些循环的结构将根据最大允许下垂定义P,然后定义积分项,以使最大积分器可以准确补偿该下垂。INTEGRAL_SPEED常数确定积分器加速的速度。(在我看来,这是确保P和我的收益始终保持适当平衡的一种合理方法,而不管我如何设置常数,但我愿意接受其他建议。) #DEFINE VOLTAGE_DROOP 25 #DEFINE VOLTAGE_SETPOINT 500 #DEFINE MAX_CURRENT_SETPOINT 20000 voltage_error = VOLTAGE_SETPOINT - VOLTAGE_FEEDBACK current_setpoint = MAX_CURRENT_SETPOINT * voltage_error/VOLTAGE_DROOP #define VOLTAGE_INTEGRAL_SPEED 4 voltage_integral += voltage_error/VOLTAGE_INTEGRAL_SPEED //insert bounds …

4
保护单片机输入引脚免受软电源开关的影响
我正在为微控制器开发软电源开关,其中瞬时开关可以打开电路(包括微控制器),然后再次按下该开关时,微控制器可以在执行一些清理操作后自行关闭。 到目前为止,我具有上述电路,但不确定是否可靠。我正在使用锂离子电池(3.7-4.2V)和TC1015调节器(3.0V输出)。这个想法是,当按下开关时,调节器打开,然后微控制器设置为uC Power高电平,保持导通状态。第二次按下该开关时,中断uC Switch将使微控制器设置为uC Power低电平,从而将其自身关闭。 我不确定的是,是否需要保护微控制器不受电池电压的影响。我使用的微控制器的I / O引脚上的绝对最大电压为Vdd + 0.4V,因此我不确定如何最好地处理。 第二,当调节器处于“关闭”状态时,该电路是否会真正阻止其开启?我曾考虑过在使能线上使用下拉电阻,但担心芯片通电时的电流消耗。 编辑:微控制器是将被切换的主要负载,因此不幸的是,将其置于低功耗模式将无法工作。 编辑2(发布答案后): 我最终使用了以下电路: 先前发布的电路工作得不是很好,并且当微控制器不为其供电时,浮动使能线存在问题。 新电路使用触发器,数据线通常拉低。按下开关将使时钟启动,从而打开系统。随后按下开关会将CLOCK线路驱动为高电平(允许微控制器感测按下),但不会影响调节器的输出。一旦微控制器准备断电,它将设置DATA高电平然后将其设置CLOCK高电平,这将导致调节器关闭。 关于此设置的真正好处之一是,第一次按下按钮即可打开调节器,并保持打开状态,直到微控制器准备关闭为止。弹跳不是问题,因为无论时钟线变为高电平多少次,数据线仍会通过下拉保持低电平。此外,电流消耗应非常小(仅当触发器和TC1015处于断开状态时),并且在接通时通过电阻的电流也将最小。 确实需要保护微控制器不受时钟线上的电池电压的影响,但是正如@Andy aka所建议的那样,可以使用上的电阻器来实现CLOCK。

3
这个AVR微控制器的电路最少需要什么零件?
我的Arduino Uno有一个ATMEGA328P-PU微控制器,板上还有许多其他东西。我想在不使用Arduino软件的情况下对芯片进行编程,而对其他组件的数量最少。我最终希望在不使用Arduino的情况下创建东西,并且想了解板上的其他部分,并根据需要将它们添加回去。我对C和gcc很满意,所以我可能可以弄清楚软件部分。但是,除了下面的这两个产品之外,我还需要带微控制器吗? Atmel编程器 微控制器

3
32位48-96 Mhz微处理器的优势(例如Arduino Due)
想要改善这篇文章吗?提供此问题的详细答案,包括引文和答案正确的解释。答案不够详细的答案可能会被编辑或删除。 看来Arduino Due(基于32位,84 Mhz,基于ARM-Cortex-M3的SAM3X8E)已经发布了。 此外,显然,这一类别中有无数的处理器(32位/ 48-96 Mhz / ARM)以及相应的原型开发板: 恩智浦LPC1768 / mBed STM32 /发现 PIC32 /芯片套件 PIC32 /视差螺旋桨 LM4F120 / TI启动板 等等 我试图理解这些“中间”微处理器的吸引力,在我看来,它们似乎位于低端AVR / MSP430 / etc之间。(优点:价格便宜,低功耗,占用空间小)和高端ARM7 / etc(优点:每秒能够提供更多指令)。 在什么情况或方式下,基于32位/ 48-96 Mhz / ARM的微处理器是合适的选择?更具体地说,我想知道在低端8位微控制器或超高端ARM7处理器上,它们将在哪种应用程序或哪些参数中为设计提供最佳选择。

2
如何选择低功耗微控制器?
的Cortex-M0 +从恩智浦和飞思卡尔声称,他们有世界领先的能源效率。 TI Wolverine还声称它们将功耗降低了一半,并且在内存,外围设备,待机和活动状态下的功耗最低。 在某些数据记录应用程序中,哪个平台消耗较少?我有3通道传感器,采样率约为3200hz。

5
生产定制电路板的最经济有效的方法是什么?
2012年6月21日更新: 我从MG Chemicals购买了氯化铁,正极显影剂和正极PCB板,并使用了光蚀刻工艺。结果太棒了!您不需要他们的喷雾罐或暴露工具。我只是将我的PCB暴露在20W紧凑型荧光灯下10分钟,然后按照说明在特百惠餐具中冲洗pcb,然后在相同的(漂洗过的)特百惠餐具中蚀刻15分钟,同时用泡沫刷偶尔搅动。 另外,我使用了喷墨打印机。说明只说使用激光打印机,但是我发现如果将打印机设置为使用非常暗的,丰富的dpi设置来打印透明胶片,则我具有足够的对比度。 结果很棒-超细细致的细痕! 背景 我最近为我的侄子购买了一些Syma品牌的室内遥控直升机。好吧,我和男孩们一起享受这些乐趣,从那时起我就开始了自己的小收藏。 尽管这些玩具既有趣又耐用,但它们使用廉价的电子产品: 红外发射器/接收器似乎在明亮的房间中失去了信号质量 单通道,因此您和其他人无法同时飞行而不会互相干扰。 关于我: 尽管我在技术上有头脑,但不是电子工程师。 我是焊接的新手,无法焊接这些小鸟里面的小板。 我想做的是: 在理想的世界中,我想为这些小鸟制作一个定制的电路板, 接受非红外信号(2.4 GHz?蓝牙?Wi-Fi?-请记住这些是“客厅”传单)。 允许您在发射器和接收器的2-3个通道之间进行选择,以便2-3个人可以同时飞行。 我意识到这可能已经适用于较大的户外鸟类,但是我需要电路板要小。 有没有一种低成本的原型制作方法?也许有个地方可以向我发送规格书,它们可以“打印”电路?像我这样的半外行可以使用的软件来设计它吗?我意识到首轮试车会很昂贵,但是我可以看到这是一个售后项目,我们这些被室内直升机所咬伤的人可以买到足够的东西来降低成本。

5
嵌入式系统的故障建模
我有一个带微控制器和2.4 GHz收发器模块的无线传感器电路,一些集成的传感器带有I²C接口,一个UART端口和必要的分立组件。 该评估板专门用于通过LiPo电池和并联充电器从太阳能(PV)面板中清除电能。这允许传感器自供电并无限期运行,从而需要最少的维护。 我想探讨在这样的系统中可能发生的故障,这些故障可能是由于老化,环境规格(温度,湿度等)的违反或维护错误(不是设计问题/错误)引起的。为了最大化其使用寿命。 传感器节点运行所在的环境是一栋附着在天花板或墙壁上的建筑物。因此,不考虑极端温度或下雨。 我想出的是我尝试总结的一些错误: 组件损坏->开路/短路 传感器故障->错误的输出值(但是怎么错?) 灰尘/水导致隔离不良->泄漏增加 温度超出范围-> ??? 我如何估计传感器节点将如何发生故障,为什么?

1
该电源电路如何工作?(MCU + LM317)
我一直在研究在搜索网络时发现的原理图。我了解PWM的要点-它使我们能够精确地改变送入运算放大器的平均电压。滤波器R1,R2和C1对PWM波形进行积分。 但是,运算放大器有什么意义呢?对我来说,它看起来像是同相放大器,其增益由R6和R7设置-如果我没有记错的话。但是为什么集成的直流电压需要放大? 也许,我不了解该部分,因为我不了解Lm317如何与MCU结合使用。我知道LM317在OUT和ADJ引脚之间下降参考电压1.25V(相对于电路,该参考电压应跨R5),而Vout定义为1.25(1 + R2 / R5)+ I(adj。)* R2。(来自数据表) 由于上式中唯一的变量是I(adj),因此我理解正确,因为集成的直流电压实际上会改变电流,从而改变输出电压? 任何见识将不胜感激。

2
与8位控制器相比,Cortex M0的性能如何?
该文件指出Cortex M0为60 DMIPS / mW,而M3为31 DMIPS / mW。(后者与本文档中的数字不一致,引用了1.25 DMIPS / MHz和0.19 mW / MHz,给出6.6 DMIPS / mW。) 有人知道M0性能/功率与8/16位控制器相比如何吗?像AVR,PIC和MSP430?M3的数字又如何处理?

10
获得整数mod 10和整数除数10的最快方法?
如果硬件不支持模数或除法运算,则需要更多的CPU周期来通过软件模拟模数/除法。如果操作数为10,有没有更快的方法来计算除法和模数? 在我的项目中,我经常需要计算整数模数10。特别是,我正在PIC16F上工作,需要在LCD上显示一个数字。有4位数字可支持,因此对模数和除法功能(软件实现)有4个调用。也就是说,如下所示: digit = number % 10; // call to an expensive function number /= 10; // call to an expensive function somehow_lit_segments(); digit = number % 10; // call to an expensive function number /= 10; // call to an expensive function somehow_lit_segments(); digit = number % 10; // …

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.