嘿!您似乎在 United States,您想使用我们的 English 网站吗?
Switch to English site
Skip to main content

使用 PSoC 6 适用的外围设备和 Clicker 2 开展试验

Clicker2_CO_627d0c835dba65174aa04d0177d906074bbff86a.jpg

Cypress Semiconductor 推出的 PSoC 6 器件是一款性能非常强大,应用十分灵活的微控制器,并且具备一系列卓越的功能。这是它的优势,然而要阅览所有的文档(Cypress 很擅长编写文档,且内容详尽),然后想到即使是相当简单的项目,也具有非常高的难度(学习曲线陡峭),尤其当您的最终目标是为特定应用构建自己的电路板时,就会产生望而生畏的感觉。这时,使用 PSoC 6 适用的 Mikroelectronica Clicker 2 可以使简单项目的各个要素一目了然。在本文中,我们回归到基础方面,并进行适当的准备,以便对我们想在 PSoC 6 项目中使用的传感器(或其它外围设备)轻松进行试验。

介绍 PSoc 6 适用的 Clicker 2

Clicker 2 采用极简主义设计,这一点与希望在单块板上展示所有 MCU 功能的大多数现代开发板不同。如果您查看原理图,能看到一个 PSoC 6、一个 PSoC 5(用于 PSoC 6 的编程和调试)、一个 LTC3586 USB 电源管理器以及用于安装两块 Mikroelectonica Click 板的连接器。除了必须设置无源元件,以及确保器件流畅运行以外,其余的工作寥寥无几。但是不用担心,您仍然可以获得对任何合理应用都十分必要的按钮开关和 LED......

这一简化设计使您可以轻松地专注于希望通过 MCU 项目达到的目标,而无需考虑各种不在预期应用范围内的多余器件和功能。它还能降低传感器和其他器件的试验难度(只需更换 Click 板),以便确定是否需要将它们设计在项目中。  

这就引出了我们今天的主题。我的抽屉里有一个基于 MQ-7 的一氧化碳检测器 Click 板 (CO Click),闲置了数月。我考虑用它来构建一个基于 IoT(或蓝牙)的警报系统,因此这似乎是一个尝试使用 MCU 以轻松处理整个应用的好机会。

设置

嵌入式系统的缺点之一在于您无法了解内部情况,因此在开发应用程序的过程中难以确定哪些方面有效,而哪些无效。我们将通过 PSoC Creator 内置的 FreeRTOS 来解决此问题,目的是将 STDOUT 重定向至通过 USB 连接的终端窗口。这样一来,我们就能使用可靠的“printf”函数来了解程序的运行情况。这是一个可以在任何 PSoC 项目的初期重复使用的简单设置,有助于项目的调试。

打开 PSoC Creator 4.2 并选择“File(文件)-> New Project(新项目)”。您将需要指定目标器件。如果您已经使用了 PSoC 6,则会出现以下图示内容:

01_-_proj_target1_05c1b5aa3e7a646233124d1072d47d518a756d55.png

本文中,我们使用的是 PSoC 63 器件。点击两次“Next(继续)”打开以下窗口(我们不更改默认值),直到来到“Select project template(选择项目模板)”。在这里,我们需要空白原理图。给项目命名,然后点击“Finish(结束)”。您将看到空白的工作空间:

03_-_select_uart_9883f54acc3b561b0d26ffd8940c71bd4a6a6848.png

我们将使用 UART 构建通信,因此我们需要从主窗口右侧的 Component Catalog(组件目录)中获取一个。最简单的查找组件的方法,是在 Component Catalog(组件目录)窗口顶部的搜索栏中输入所需组件的名称。然后只需拖动组件并放置在主窗口中即可:

04_-_uart_ffb83726f04e16dfffd0b5a3795a09f9e89eefe1.png

我们将维持 UART 的默认设置不变,因此无需双击它(打开设置窗口),但是我们需要将 UART 连接至正确的输出引脚,这些引脚可以从 Clicker 2 板的原理图中找到:

02---UART_pins1_ae68609883803c8988242cb3315668f576712b2b.jpg

因此我们需要连接至 P12.1 和 P12.0,这时可以通过双击主窗口左侧的 Workspace Explorer(工作区管理器)中的“Pins(引脚)”进行设置:

05_-_uart_pins_0dffef672c2de5af6f5bbdfcb3c250092aa6f92b.png

看起来我的原理图与 PSoC Creator 在哪个引脚是 Rx、哪个引脚是 Tx 方面有些出入,那么我们将以 PSoC Creator 为准。

现有我们需要将 STDIO 重定向到 UART 上,这样才能将“printf”语句发送至终端。我们从设置 FreeRTOS 开始着手。鼠标右键点击项目名称,然后选择“Build Settings...(构建设置...)”:

06_-_buils_settings1_e6f8518dc21d894ff8dd4214dbb307942bc993d9.png

接着找到“Peripheral Driver Library(外设驱动程序库)”并勾选 FreeRTOS 下面的“Memory Management(存储器管理)”(使用默认堆)和“Retarget I/O(重定向 I/O)”:

07_-rtos_settings_b75cd8523b01adb22a756cb6c44a73e685577616.png

至此,我们可以在顶部菜单栏中选择“Build(构建)-> Generate Application(生成应用程序)”,以确保我们的所有设置都是正确的。做得不错!

这时 PSoC Creator 已向我们的项目中添加了一些文件,其中包括 FreeRTOS、stdio_user.c、stdio_user.h 和 retarget_io。我们需要对 stdio_user.h 进行修改:

08_-_stdio_user_h_80bafbf3b0dcbb1e48de8cf307c8d96db9e5422d.png

我们添加以下程序行:

#include <project.h>

在顶部修改 UART 定义:

#define IO_STDOUT_UART          UART_1_HW
#define IO_STDIN_UART           UART_1_HW

接着我们打开 FreeRTOSConfig.h

09_-_FreeRTOSConfig_h_509c2025aec62d552b9c58187cf6d476c675611f.png

然后为第 45 行的警告添加注释,随后在第 71 行修改堆大小:

#define config_TOTAL_HEAP_SIZE      (48*1024)

现在我们已修改完毕,可以进入 main_cm4.c(从 Workspace Explorer(工作区管理器)中打开)并加入一些代码,目的是启动 UART 进行通信,并在终端上显示内容。

10_-_code_7a24ef3b3c8c80550dccc6666606a3db9f4e7b2e.png

#include "project.h"
#include <stdio.h>
 
int main(void)
{
    __enable_irq(); /* Enable global interrupts. */
 
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
 
    PWM_1_Start();
    UART_1_Start();
    
    printf("\033[2J\033[H"); // Clear Screen
    printf("Test\r\n");
    
    
    for(;;)
    {
        /* Place your application code here. */
    }
}

在运行代码之前还有一件事情:设置类似于 Putty 或 Tera Term 的终端模拟器。为此,我们需要打开 Windows 设备管理器,查看 KitProg2 USB UART 连接在哪一个 COM 端口上:

11_-_device_manager1_078a01fbefcb6958e6570fc7e810e486b6d20aa3.png

我是连接在 COM12 上。我们可以将此端口设置在终端设置中。我使用的是 Putty,设置窗口如下图所示:

12_-_putty_settings_5aa79fab09adb0a316a513101e5c8e787f19ba5d.png

打开终端,然后返回 PSoC Creator,点击“Program(程序)”按钮(位于 Workspace Explorer(工作区管理器)的正上方)。当应用程序构建完成并加载到 PSoC 6 之后,我们可以返回终端,然后大功告成!以下是我们的消息:

13_-_putty_op_43ccc9aeb7233dae35d3443cfd8cf886359386ec.png

添加传感器

既然我们的调试方案已设置完毕,那么可以开展真正的试验了。对照 CO Click 板的原理图,我们可以看到从传感器到 AN 引脚有一路模拟输出:

13a_-_sensor_schematic_b53930aa71d4be41b941dbc938306558d42c5005.png

回到 Clicker 2 板的原理图,我们可以看到 Click 板 Site 1 的 AN 引脚连接到 PSoC 6 的 P10.4 上。因此我们需要设置模数转换器 (ADC) 来读取该引脚的电压。

如果我们在 PSoC Creator 的组件目录中搜索“ADC”,将可以找到 Scanning SAR ADC,我们可以将其拖放到顶层设计中:

14_-_add_adc_cfb01b4fc9bddb92e9af1a8bb845a9b0df44ab64.png

我们需要这样设置,以获得输入范围足以满足 5 V 器件的单端输入:

15_-_adc_settings1_68e719ae08ebd32d276d0f83b1d0e110e7028467.png

设置好这些参数后,我们还需要一个连接 ADC 的模拟引脚。我们可以在 Component Catalog(组件目录)中找到它。将它拖放到设计中,并连接至 ADC 输入端:

17_-_analog_in_17d0f27bb4ee2ed67a1009ef5e2092faa0f4e9c8.png

然后我们将该引脚连接至引脚图中的 P10.4:

18_-_set_pin_f1726c0b2e3ba966a2a41e6d2e6191d9c9144221.png

接下来,我们需要一些代码来驱动数据收集。我在 Mikroelectronica 代码网站的 CO Click 示例代码中找到一个可以将 ADC 测出的电压转换为百万分比浓度值 (PPM) 的公式。我们将在自己的代码中使用这一公式:

/* ========================================
 *
 * Reading data from an MQ-7 CO sensor
 *
 * ========================================
*/
#include "project.h"
#include <stdio.h>
#include <math.h>

const double Rl       = 5000.0;              // Rl (Ohm) - Load resistance
const double Vadc_2x  = 0.0016113281;        // ADC step 2*Vref/4096 1.61mV (12bit ADC)
const double Vadc_33  = 0.0008056641;        // ADC step 3.3V/4096 0.81mV (12bit ADC)
double Vrl;                                  // Output voltage
double Rs;                                   // Rs (Ohm) - Sensor resistance
double ppm;                                  // ppm
double ratio;                                // Rs/Rl ratio

int16_t adc_rd, adc_V;
char txt[16];

//Calculation of PPM
void calculatePPM() {
  double lgPPM;
  Vrl = (double)adc_rd * Vadc_2x;            // For 3.3V Vcc use Vadc_33
  Rs = Rl * (5 - Vrl)/Vrl;                   // Calculate sensor resistance
  ratio = Rs/Rl;                             // Calculate ratio
  lgPPM = (log10(ratio) * -3.7)+ 0.9948;     // Calculate ppm
  ppm = pow(10,lgPPM);                       // Calculate ppm
}

int main(void)
{
    __enable_irq(); /* Enable global interrupts. */

    UART_1_Start();
    printf("\033[2J\033[H"); // Clear Screen
    printf("Terminal Output Running...\r\n");
    
    ADC_1_Start();
    
    printf("Conversion starting now...\r\n\n");

    for(;;)
    {
        ADC_1_StartConvert();
        Cy_SysLib_Delay(50);
        adc_rd = ADC_1_GetResult16(0);                // Connected to mikroBus1 AN pin/P10.4
        Cy_SysLib_Delay(50);
        adc_V = ADC_1_CountsTo_Volts(0, adc_rd);  
        Cy_SysLib_Delay(50);
        ADC_1_StopConvert();
        Cy_SysLib_Delay(50);
        
        calculatePPM();                               // Calculating PPM value
        printf("ADC value = %d, Volts = %f, ppm = %f\r\n", adc_rd, Vrl, ppm);
        Cy_SysLib_Delay(5000);
    }
}

/* [] END OF FILE */

现在我们准备好对 PSoC 6 进行编程了。当我们把这些全部加载到器件并查看终端时,我们将获得一些数据。太棒了!

19_-_putty_OP1_77e2c2ef6d81c7402ed920e81c881321889c1708.png

复核:通过测量 CO Click 上的 AN 和接地引脚之间的电压(借助可靠的 RS Pro 数字万用表),我们得到了相同的电压值。好极了,我们的 ADC 达到了预期效果。

因此,如果我要用 PSoC 6 来提醒我空气中的一氧化碳浓度偏高,那么问题在于:如何微调电压(通过 CO Click 上的电位器)以获得较为准确 PPM 测量值?请参阅 MQ-7 数据表

好的,刚刚注意到了一些有趣的事情:事实证明,传感器所需的设置确实比我们使用的设置更为复杂。为了获得最准确的读数,我们需要设置传感器加热器,并运行高温和低温加热循环,这时(以 5 V 加热 48 小时后)我们通入 5 V 电压 60 秒,但不采用这些读数。接着,我们通入 1.4 V 电压 90 秒,然后将这些读数用于计算 CO 测量值。在高温阶段中,CO(以及任何其它可燃气体化合物)从传感器板上基本蒸发干净,这为低温测量阶段做好了准备,从而实现准确的测量。我们将继续重复这些循环。

我们的 CO Click 未设置执行此循环,因此虽然我们仍然能够检测到一氧化碳的存在,但是我必须重新考虑如何在已有模块的基础上改进设计,以获得真正准确的测量值。

结语

尽管使用 MQ-7 传感器准确地测量一氧化碳浓度值比我预想的要耗费更多精力,但是 PSoC 6 板适用的 Clicker 2 使试验过程变为相当简单的命题。此外,其它种类的一氧化碳 Click 板 (CO 2 Click) 的试验也将同样简单,但是我可能会在尝试之前浏览传感器的数据表!

作为精简至极的 PSoC 6 开发板,我很喜欢 Clicker 2。它使您能够明确地关注您在项目中使用的传感器或其它外围设备,并且我期待不久的将来在该板上添加一些其它的 Click 板模块。

Mark completed his Electronic Engineering degree in 1991 and worked in real-time digital signal processing applications engineering for a number of years, before moving into technical marketing.