This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/CC2650:由电力线干扰引起的 DIO 上的 CC2650中断、如何解决?

Guru**** 2582405 points
Other Parts Discussed in Thread: CC2650, CC2630

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/799029/rtos-cc2650-cc2650-interrupt-on-dio-cause-by-power-line-interference-how-to-solve-it

器件型号:CC2650
主题中讨论的其他器件: CC2630

工具/软件:TI-RTOS

您好!

我的项目需要一年时间、但尚未完成、我从 CC2630更改为 CC2650、但现在还有另一个问题。

我在 DIO 上有一些按钮和上拉电阻器、它控制风扇和接触器、在风扇和接触器改变其状态(从附近的一个中、使用同一条交流线路)时、通过交流/直流转换器的电源运行、

按钮中断调用(按钮未按下)的代码会导致按钮行为错误。 我有二极管来消除继电器线圈的干扰,交流/直流转换器是 PWM 1,二极管电桥,带有全电容器滤波器。

这是按钮代码:

/*创建 MSA 密钥引脚表。 这将覆盖
* BoardGpioInitTable[]中的关键属性。
*/
静态 PIN_Config keyPinTable[]=
{
   Board_key_reset | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_迟滞、// key_reset 
   Board_key_B1 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_迟滞、// key_B1
   PIN_TERMINATE /*终止列表*/ };

/*********
*@fn board_key_keyFxn
*
@按键的简短中断处理程序
*
/
void board_key_keyFxn (PIN_Handle keyPinHandle、PIN_ID keyPinId)
{
UINT_t b1Active = 0;
UINT_t resetActive = 0;

//不使用输入参数
(空) keyPinHandle;

if (keyPinId = Board_key_B1)
{
//获取 PIN 值,它为低电平有效
if (PIN_getInputValue (Board_key_B1)=0)
{
//按钮1处于活动状态
b1Active = true;
}

//查找第一次按按钮1
if (b1Active &&(keysPressed & key_B1)=0)
{
keysPressed |= key_B1;
b1Key.tStart = Clock_getTicks();
}

//查找按钮1的第一次释放
if (((b1Active == false)
&&(keysed 和 key_B1)
&&(b1Key.tStop ==0)
{
b1Key.tStop = Clock_getTicks();
}

}
否则、如果(keyPinId = Board_key_reset)
{
//获取 PIN 值,它为低电平有效
if (PIN_getInputValue (Board_key_reset)=0)
{
//重置按钮处于活动状态
resetActive = true;
}

//查找第一次按下重置按钮的情况
if (resetActive &&(keysPresed & key_reset)=0)
{
keysPressed |= key_reset;
resetKey.tStart = Clock_getTicks();
}

//查找第一次释放的 RESET 按钮
if ((resetActive == false)
&&(keysed 和 key_reset)
&&(resetKey.tStop =0)
{
resetKey.tStop = Clock_getTicks();
}
}


//触发按键事件
if ((resetActive =false)&&(b1Active=false)
&&(keysPresed!= 0))
{
//已按下并释放键
//立即触发按键事件
Board_key_changeHandler (0);
}
其他
{
//启动按住计时器
if (Util_isClockActive (&keyChangeClock)!= true)
{
Util_stopClock (&keyChangeClock);
}
Clock_setTimeout (keyClkHandle、
(factory_reset_press_period * timer_MS_adjustment);
Util_startClock (&keyChangeClock);
}
} 

我使用 PIN_IRQ_BOTHEDGES、因为我希望对这些按钮执行长按操作。

我从 Ghostyu 购买的 CC2650模块的原理图如下:

e2e.ti.com/.../CC26XXMOD_2D00_RGZ_2D00_V1.1.pdf

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    首先、我将研究电源的去耦、如果您有此问题、请选择其他电源解决方案。 此外、看起来代码中没有任何去抖逻辑。 如果您在以下代码中查看回调函数: dev.ti.com/.../node 、则会添加一些额外的代码、以确保在读取时按钮仍然按下、因为机械按钮在按下后会弹出一些。

    您是否有一个示波器图、说明相关 DIO 上的输入电压是如何变化的?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../20190504_5F00_125922.mp4You可以在上面的原理图中看到,模块本身有去耦电容,VCC 和 GND 引脚附近有额外的0.1和10uF 电容。

    我看到代码:   

    /*去抖逻辑,仅在按钮仍被按下(低电平)时切换*/

      CPUdelay (8000*50);

    此 CPU 延迟是否会影响 ZigBee 无线电接收代码?

    VCC 和 GND 上有示波器、您可以在连接中看到。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    示波器视频是否仅显示 VCC 线路上的噪声(而不是按下按钮时的噪声?)

    测量结果上的称重器拉力是否为1V? 如果是这样、电压脉冲会高几伏?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它是3V 电源的 VCC 和 GND 上的交流脉冲、可能是电容器将消除交流。 我在代码中添加 CPUdelay (8000*50)似乎更稳定,但从示波器上看,错误仍然会发生,脉冲尖峰大约为0.1ms,所以我只是将 CPU 延迟大约0.1ms?
    如何使用 CPUdelay 函数计算延迟时间?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对于交流脉冲:我认为您必须以某种方式消除它。 它是否在芯片的最大额定值范围内?

    正确的是 CPUdelay(8000*50);可能会影响堆栈。 该延迟在 HWI 上下文中被阻断、这意味着如果堆栈需要在延迟进行期间执行某些操作、堆栈事件将被阻止。

    更好的解决方案是使用一次性时钟对象。 按下按钮时、时钟启动。 在去抖时间之后、检查按钮状态。 这样、在避免去抖动问题时、您不会阻止任何内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我将尝试滤除交流脉冲、但它不是100%、因此我将使用反弹代码。
    我在这里使用去抖: dev.ti.com/.../node 使用时钟。 但是、对于长按、在使用传感器标签中的长按实施之前、我还无法使其正常工作、但它没有去抖。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我假设您需要实现如下所示的操作:
    -按下按钮引起的中断
    -启动时钟
    -时钟回调、检查按钮是否仍然按下、去抖功能。
    -使用不同的时间重新启动时钟以检测长按
    -时钟回调、检查按钮是否仍然按下、如果是、请长按。