Questions tagged «microcontroller»

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


5
什么是XMOS系列?
好的,所以最近我一直在看到XMOS这个名字出现在地方。我浏览了他们的网站并在线搜索,但是我不太清楚这是什么吗?那是什么 这似乎是微控制器和FPGA之间的交叉点吗? 我还浏览了他们的站点,但看不到我所能理解的任何东西(仅仅是示例设计和其他参考文档),因为它们是XMOS以及它与其他微控制器系列的不同之处。

10
带有Java API的微控制器
我的硬件团队计划在未来的项目中使用Atmel AVR 8位微控制器。 据我所知,它必须用C编程。我已经找到了用于AVR 的JVM,尽管它比Atmel的本机C库更受限制。 您能建议我一个支持Java的8位微控制器吗? PS。我不了解C,并且我对微处理器编程没有经验。


3
通过CAN总线选择网络层
我打算在工业自动化应用中使用CAN总线,但是我很难决定如何实现网络层。这里是否有人对在CAN上使用更高层协议有任何建议,该协议为如何分配消息ID和如何格式化数据包提供了指南?我应该开发自己的专有网络层还是实施CANopen等现有标准?

8
我应该使用什么微控制器?
我正在尝试寻找最适合我的计算机程序与现实世界通信的微控制器程序包。我希望有大量的I / O引脚(到目前为止,我只需要64个数字引脚,没有比模拟和PWM更好的了),我可以通过从运行在CPU上的程序调用函数来直接进行读写。 我不想将程序下载到微控制器本身上运行,而是希望将某些东西简单地插入我的USB并给我一堆可以由C ++程序控制的CPU控制的I / O引脚。 什么是最适合我的微控制器包?我希望它的价格相对便宜,但要面向未来,因为它可以运行USB,并具有适用于Windows 7等现代OS的64位驱动程序。以及巨大的奖金(未来扩展)。 编辑:我不需要高采样率(也许10 Hz的读取输入,1 kHz的输出信号),并且大多数引脚仅用于输出。我正在使用全新的计算机(核心i7 860),因此,即使采样效率较低或较慢,也应该可以(仅使用一个专用于I / O的线程,并使主程序与之通信)。 我也不需要单个微控制器封装上的所有64个I / O引脚。如果我可以同时连接许多微控制器程序包,那也可以工作(实际上,能够连接许多较小的微控制器程序包是理想的,这意味着扩展很容易)。 我已经看过了:http : //www.schmalzhaus.com/UBW32/index.html 有没有人有过类似的经历?知道是否可行吗?主要担心的是运行程序的是微控制器,而不是我的CPU。

4
最好的PIC程序员?
我想开始在我的项目中使用PIC,想知道我应该选择哪个程序员。我在使用微控制器(68k,avr)方面有丰富的经验,在电子方面也有很多经验(因此可以创建一个程序员)。 我希望能够使用MPLAB,icsp,并且在线调试功能看起来很整洁。USB也很方便,但这不是必需的。在您的回答中,我希望对您的建议的优缺点进行比较。

7
Parallax Propeller是好的产品吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 Parallax Propeller如何与其他多核解决方案相提并论?我刚刚看了一篇有关开放式踩脚项目的文章,该文章赢得了他们的设计竞赛。我想看看别人对这款芯片的看法。有没有类似但更好的产品? 旋转速度如何?

3
随机且不可预测的模拟比较器行为
我正在一个相对“简单”的项目中工作,我需要测量振幅和频率变化的正弦波的频率。为了简化起见,现在,我只有一个固定频率(27Hz)的正弦波输入(比较器的负输入),该振幅只能通过幅度(使用电位计)进行改变。比较器的正输入设置为Vcc / 2。然后,将比较器的输出馈送到atmega2560微控制器的输入捕获寄存器,以测量频率。 问题是,在输入信号的某些振幅下,我在输出上会出现非常强烈的切换(有时甚至是死区),如下所示: 预期输出应如下所示: 到目前为止我尝试过的事情: 使用内部atmega2560的内部比较器。使用外部比较器。使用软件和施密特触发器电路介绍磁滞。尝试了各种输入设置,包括固定参考设置和数据切片器设置。尝试使用不同的atmega2560。尝试不同的时钟速度。 一些解决方案比其他解决方案更稳定,但没有一个是可以接受的。到目前为止,我已经采用了最稳定的配置: 使用此设置,某些功能可以改善/更改稳定性,但是仍然远远不能达到完美: 更改R5的值以增加磁滞。完全删除C2(不知道为什么)。面包板上的触摸导线(很多导线彼此相邻)。将电源从外部切换到USB,反之亦然。 此时,要么是噪声,要么是我的DAC(正弦波),要么是我做的非常根本的错误操作。该电路已经为其他人工作,没有任何问题,因此我的配置或环境一定存在问题。 如果有人有任何建议,我将不胜感激。 这是我的最小资源: #include <avr/io.h> void init(void); void init(void) { /* Setup comparator */ ACSR = (1 << ACIE) | (1 << ACIS1); /* Initialize PORTD for PIND5 */ DDRD = 0x00; PORTD = 0x00; /* Enable global interrupts */ …

5
PIC32 vs dsPIC vs ARM与AVR,无论如何,当我们使用C语言编程时,体系结构是否重要?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 我们目前正在使用32位PIC32单片机。它可以很好地满足我们的需求,但是我们也在探索其他微控制器,这些微控制器可以更好地适应我们的需求+我们还有其他项目正在选择MCU。为了这个目的,我们选择了基于ARM的SAM DA微控制器,它是相同的32位但基于ARM(在工业上比PIC32更流行)。 现在,对于PIC32,我们使用MPLAB,而对于ARM cortex-M0,我们将使用Atmel Studio。我们将在两个平台中使用C语言。我担心的是,我们将使用两个(来自同一公司的)32位微控制器,但它们的体系结构不同。这将要求我们学习两种不同的设备,并会增加“学习曲线” +交付时间。但是另一方面,我也认为,既然我们将在两种情况下都使用C语言,那么ARM的学习曲线就不应该被人听到,也值得探索该处理器。 我的主要问题是,当我们使用C语言编程时,该体系结构有多大的差异,因为它提供了micrcontroller内部的抽象。而什么是MPLAP和爱特梅尔Studio中的主要区别,考虑到C语言编程。

4
使用HAL的STM32 ADC转换
我正在尝试学习如何从stm32使用“新” HAL库。 当我尝试进行简单的ADC转换时,它只能运行一次,但随后会停止转换。我想转换结束标志未设置。我正在使用STM32f429I发现板,板上有STM32f429ZI。 请注意,我知道sprintf是一种不好的做法,并且使带有中断的adc更好,我知道,请不要指出这一点,这与问题无关,我只是在这里测试HAL。 所以问题是为什么未设置EOC标志,或者我应该怎么做才能使其正常工作?谷歌搜索没有太大帮助,因为那里关于HAL的好材料很少。 这是代码: __IO uint16_t ADCValue=0; void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc); int main(void) { char str[15]; /* Various initializations */ HAL_ADC_Start(&hadc1); while (1) { if (HAL_ADC_PollForConversion(&hadc1, 1000000) == HAL_OK) { ADCValue = HAL_ADC_GetValue(&hadc1); sprintf(str, "%d", ADCValue); BSP_LCD_DisplayStringAt(130,30, (uint8_t*)str, LEFT_MODE); } } void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { ADCValue = HAL_ADC_GetValue(&hadc1); } …

4
STM32:定时器中断立即起作用
这是我的STM32F429项目中的计时器代码: //timer initialization void timerInit() { uwPrescalerValue2 = (uint32_t) ((SystemCoreClock / 2) / 100000) - 1; RS485Timer.Instance = TIM5; RS485Timer.Init.Period = 67400000; // high value to notice interrupt even without debugging RS485Timer.Init.Prescaler = 400000; RS485Timer.Init.ClockDivision = 0; RS485Timer.Init.CounterMode = TIM_COUNTERMODE_UP; HAL_TIM_Base_Init(&RS485Timer); } void timerReset() { HAL_TIM_Base_Stop_IT(&RS485Timer); HAL_TIM_Base_DeInit(&RS485Timer); HAL_TIM_Base_Init(&RS485Timer); HAL_TIM_Base_Start_IT(&RS485Timer); printf("%d …

7
Arduino串行打印不希望地改变了程序的行为
我正在使用在标头中声明的循环计数器: int loop_counter = 0; 我经常使用此计数器触发事件​​。我曾经对这种类型的行为使用模,但是我简化了它,因此使用起来更容易(它仍然会导致相同的行为) void loop() { if(loop_counter > 100) loop_counter = 0; else loop_counter++; //Serial.println("hey"); if(loop_counter == 0) { //do_something_important(); } } 一切都很好,直到我尝试Serial取消注释//Serial.println("hey"); ("hey"在此示例中,因为对我而言,这种行为是荒谬的)来与之交流。 这将导致loop_counter永远不会触发do_something_important();代码部分。我尝试声明loop_counter为volatile,但没有任何改变。我尝试了Serial.printing loop_counter,而且我也得到了奇怪的行为(它将冻结循环)。 Serial.println("hey");在串行监视器中,我得到很多“嘿”的意思(即很快超过100个“嘿”,这是另一部分代码应触发的迭代次数) 是什么原因导致的使用Serial,而数据(据我所知)并未loop_counter完全阻止其正常运行? 编辑:这是最终导致问题的主文件部分(嗯,为它做出了最大的贡献(使用过多的内存)): void display_state() { int i,j,index=0; short alive[256][2]; for(i=0;i<num_rows;i++) { for(j=0;j<num_cols;j++) { if(led_matrix[i][j]==1) { alive[index][0]=i; alive[index][1]=j; index++; } } …

5
频繁写入非易失性存储器
我正在设计一种会随温度变化自动调整其物理位置的设备。如果设备关闭或电源断开,则设备需要记住其上次的温度和位置。我可以将这些值存储在EEPROM中,但问题是位置和温度变化非常快。如果每次更改后将温度和pos写入EEPROM,这将(1)降低固件速度,(2)一两年后可能会杀死EEPROM。因此,正如我所见,我的选择如下... 1)断电后,请使用电容器/电池在短时间内保持设备供电,以便我只能在那时将值写入EEPROM。我不喜欢这样,因为该板有点耗电,这需要很大的限制。而且我没有大量的可用空间。而且,我不希望电池和电池座的额外成本或大笔费用。 2)使用F-RAM代替EEPROM,这样我就可以写万亿次而不会用完。我不喜欢这个选项,因为FRAM比EEPROM贵很多,而且是用于生产产品的(不仅仅是一个)。 3)仅每5分钟左右写一次位置和温度。这样,我总是会记录最近的位置/温度,但我不会每秒写入一次,因此程序不会变慢,而EEPROM不会死得那么快。这似乎是我最好的选择。 还有其他人有我没有想到的建议吗?

3
使用超级电容器作为MCU的备份
我有一个需要某种备用电源的项目。而且我打算使用5V 4F超级电容。 我的问题是: 我打算用一个二极管和100欧姆电阻将电容充电至5V VCC(好主意?)。如何将电容连接到MCU。直接连接将不起作用,因为上限会花费一些时间。 通常情况下,该电路将消耗20mA的电流,在断电模式下,它将消耗约200uA的电流,这个4F电容将持续多久?

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.