你觉得这篇文章怎么样? 帮助我们为您提供更好的内容。
Thank you! Your feedback has been received.
There was a problem submitting your feedback, please try again later.
你觉得这篇文章怎么样?
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,则会出现以下图示内容:
本文中,我们使用的是 PSoC 63 器件。点击两次“Next(继续)”打开以下窗口(我们不更改默认值),直到来到“Select project template(选择项目模板)”。在这里,我们需要空白原理图。给项目命名,然后点击“Finish(结束)”。您将看到空白的工作空间:
我们将使用 UART 构建通信,因此我们需要从主窗口右侧的 Component Catalog(组件目录)中获取一个。最简单的查找组件的方法,是在 Component Catalog(组件目录)窗口顶部的搜索栏中输入所需组件的名称。然后只需拖动组件并放置在主窗口中即可:
我们将维持 UART 的默认设置不变,因此无需双击它(打开设置窗口),但是我们需要将 UART 连接至正确的输出引脚,这些引脚可以从 Clicker 2 板的原理图中找到:
因此我们需要连接至 P12.1 和 P12.0,这时可以通过双击主窗口左侧的 Workspace Explorer(工作区管理器)中的“Pins(引脚)”进行设置:
看起来我的原理图与 PSoC Creator 在哪个引脚是 Rx、哪个引脚是 Tx 方面有些出入,那么我们将以 PSoC Creator 为准。
现有我们需要将 STDIO 重定向到 UART 上,这样才能将“printf”语句发送至终端。我们从设置 FreeRTOS 开始着手。鼠标右键点击项目名称,然后选择“Build Settings...(构建设置...)”:
接着找到“Peripheral Driver Library(外设驱动程序库)”并勾选 FreeRTOS 下面的“Memory Management(存储器管理)”(使用默认堆)和“Retarget I/O(重定向 I/O)”:
至此,我们可以在顶部菜单栏中选择“Build(构建)-> Generate Application(生成应用程序)”,以确保我们的所有设置都是正确的。做得不错!
这时 PSoC Creator 已向我们的项目中添加了一些文件,其中包括 FreeRTOS、stdio_user.c、stdio_user.h 和 retarget_io。我们需要对 stdio_user.h 进行修改:
我们添加以下程序行:
#include <project.h>
在顶部修改 UART 定义:
#define IO_STDOUT_UART UART_1_HW
#define IO_STDIN_UART UART_1_HW
接着我们打开 FreeRTOSConfig.h
然后为第 45 行的警告添加注释,随后在第 71 行修改堆大小:
#define config_TOTAL_HEAP_SIZE (48*1024)
现在我们已修改完毕,可以进入 main_cm4.c(从 Workspace Explorer(工作区管理器)中打开)并加入一些代码,目的是启动 UART 进行通信,并在终端上显示内容。
#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 端口上:
我是连接在 COM12 上。我们可以将此端口设置在终端设置中。我使用的是 Putty,设置窗口如下图所示:
打开终端,然后返回 PSoC Creator,点击“Program(程序)”按钮(位于 Workspace Explorer(工作区管理器)的正上方)。当应用程序构建完成并加载到 PSoC 6 之后,我们可以返回终端,然后大功告成!以下是我们的消息:
添加传感器
既然我们的调试方案已设置完毕,那么可以开展真正的试验了。对照 CO Click 板的原理图,我们可以看到从传感器到 AN 引脚有一路模拟输出:
回到 Clicker 2 板的原理图,我们可以看到 Click 板 Site 1 的 AN 引脚连接到 PSoC 6 的 P10.4 上。因此我们需要设置模数转换器 (ADC) 来读取该引脚的电压。
如果我们在 PSoC Creator 的组件目录中搜索“ADC”,将可以找到 Scanning SAR ADC,我们可以将其拖放到顶层设计中:
我们需要这样设置,以获得输入范围足以满足 5 V 器件的单端输入:
设置好这些参数后,我们还需要一个连接 ADC 的模拟引脚。我们可以在 Component Catalog(组件目录)中找到它。将它拖放到设计中,并连接至 ADC 输入端:
然后我们将该引脚连接至引脚图中的 P10.4:
接下来,我们需要一些代码来驱动数据收集。我在 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 进行编程了。当我们把这些全部加载到器件并查看终端时,我们将获得一些数据。太棒了!
复核:通过测量 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 板模块。