PWM除了可驱动电机外,还可以设置不同频率以模拟不同音阶的音符输出,实际测试发现,声音还是蛮动听的,不过常见的有源蜂鸣器可不行(红牛开发板自带),需要专门采购无源蜂鸣器,这二者的区别是有源蜂鸣器通电就响,而无源蜂鸣器需要输入一定频率的信号才能发声。
我们采用Timer3作为PWM的输出源,我们计数固定为为36,占空比也固定为1/2,通过分频系数来设定相对应的PWM输出频率。
底层代码如下,由于官方无PWM驱动模板,如下函数由我自行定义。
//采用Timer3 36MPB0输出
CPU_TIMER_Initialize(timer,36,PSC,Music_ISR,(void *)timer);
CPU_TIMER_SetCCR(timer,2,param0==0 ? 0:18);
UINT32 m_Count= param0*param1/1000;
CPU_TIMER_SetCCM(timer,2,6); //PWM1模式
CPU_TIMER_PWM_Start(timer,2);
CPU_TIMER_Start(timer);
音符频率对应表如下,根据这个,我们通过PWM就可以输出不同音阶的音符:
音符
频率/HZ
半周期/us
音符
频率/HZ
半周期/us
音符
频率/H...

>> 阅读全文

选用的步进电机的型号为28BYJ-48(或MP28GA,5V,转速比1/64),驱动电路选用uln2003芯片的驱动板,其控制时序图如下:
四相八拍:A->AB->B ->BC ->C ->CD ->D ->DA
其A、B、C、D指的是uln2003芯片驱动板的1N1、1N2、1N3、1N4,波形在上表示有输入信号,波形在下表示无输入信号。
我们采用红牛开发板进行步进电机控制,为了便于接线,我们需要在红牛开发板上焊接两条30脚双排排阵,焊接后的红外板如下:
此外至少需要4根杜邦线,还需提供一个5V的直流电源,接线方式如下:
PC4接IN1
PC5接IN2
PC6接IN3
PC7接IN4
5V电源连接
网友fangyuan和奋斗中写了一个纯.NET MF C#的控制代码,比较容易理解,但是由于是托管代码,需要虚拟机解释执行,所以运行效率较低,部分代码如下:
//四相八拍:A->AB->B->BC->C->CD->D->DA
while (true)
{
//A相输出高电平,BCD低
pios[0].Write(high);
pios[1].Write(low);
pios[2].Write(l...

>> 阅读全文


农村合作医疗改善了农民看不起大病问题,但慢性病的诊治仍依赖于基层医生,目前我国有约1百万基层医生,他们普遍没有受过正规医疗培训;随着农村糖尿病和高血压发病率迅速上升,对基层医生的早期诊断技能要求越来越高。提供本方案(或产品)的初衷就是为基层医生提供低成本、便携和易用诊断终端和结果提示;为基层医生和病人提供远程医生诊断建议;提供血压和血糖历史数据便于诊断和跟踪。同时易于扩展、大规模部署和管理。
方案简介:
1.个人医疗远程节点数据采集:低成本.NET传感器网关与家用血糖仪和/或腕式血压计相连实现数据采集,并通过无线网传输;病人身份信息采集:RFID卡和摄像头完成病人个人信息采集;测量结果评价:根据管理平台预设诊断标准,给出评价的声光指示,通过手机短信提醒预警来协助基层医生诊断,以改善病人知晓率;服药提醒:通过语音和灯光提醒病人服药,以提高病人治疗率;
2.网关管理平台网关管理:Windows server及其网关管理应用实现远程网关管理和升级,以支持远程不同类型血糖仪和/或血压计连接。用户和数据管理:通过SQL Server管理用户个人信息、告警/语音提示管理和血糖及血压等数据;...

>> 阅读全文

STM32F103xx Cortex-M3系列的芯片含三路SPI通道,红牛开发板用了两路,SPI1连接AT45DB161B型号的SPI Flash,SPI2连接ADS7843触摸屏信号处理芯片,SPI3最好不要用,因为和JTAG的管脚有冲突,调试时会有问题。EM-STM3210E开发板由于不含触摸屏,所以只用了一路来连接SPI Flash。本篇博文介绍触摸屏坐标获取,所以只有拥有红牛开发板的用户可以测试。
先简单介绍一下SPI相关的知识,SPI是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间,是一种高速的,全双工,同步的通信总线。
SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(用于单向传输时,也就是半双工方式),相关管脚含义如下:
(1)SDO – 主设备数据输出,从设备数据输入   
(2)SDI – 主设备数据输入,从设备数据输出
(3)SCLK – 时钟信号,由主设备产生  
(4)CS – 从设备使能信号...

>> 阅读全文

AD/DA输入输出、PWM及其它底层硬件控制,.Net Micro Framework官方底层驱动代码及上层C#库并没有对这些功能进行封装,所以要想添加这类硬件的控制接口,需要从下到上进行全方位设计。
AD模拟量的采集没有想象的那么简单,从转换方式来说,有单次转换、连续转换之分,从模式来说,有扫描模式和间断模式,而间断模式下又分为规则组和注入组,采集时各通道可以独立采集,也可以批量采集等等。
简单期间,我这里仅封装了间断模式下的规则组独立采集方式(单次转换)。
针对驱动层,我定义了如下函数接口:
BOOL CPU_ADC_Initialize();
void CPU_ADC_Uninitialize();
BOOL CPU_ADC_Start(UINT8 adc);
BOOL CPU_ADC_Stop(UINT8 adc);
BOOL CPU_ADC_Read(UINT8 index,UINT16 *value, UINT32 spm, UINT32 flag );
针对STM32F10xxx系列的芯片,包含ADC0、ADC1、ADC2三个AD控制器,每一个又包含18个采集通道(其中两路是内部通道),其中ADC0的内部通道16、17分别为芯片温度和芯片电压值。
C#上层库的接口定义如下:
namespace YFSoft.Hardware
>> 阅读全文

在工控项目中,PLC一般必不可少,现场控制一般以它为核心,而PC系统一般只是起到远程监控、图表和数据存储的作用。除了PLC之间,PC和PLC之间通信外,一般一些智能显示模块(如型号各异的触摸屏 HMI系统)也和PLC通信,我们就要把把承载.NET MF的系统打造成一个最简单的HMI系统,远程操控PLC。
一般国外每一个PLC厂家,其通信协议一般都是不同的,如西门子PLC的PPI/MPI、欧姆龙 PLC的HostLink、AB PLC的DF1、施奈德 PLC的Modbus等等,由于Modbus协议简单、并且公开,所以国内一些PLC和智能模块大都是支持Modbus协议的,西门子200系列的PLC只要加载一个官方Modbus库,也是可以非常方便的支持Modbus协议。
在上一篇文章《PC通过Modbus协议远程操控开发板》,我们把Modbus Rtu client运行在PC端,这次我们把这部分程序移植到.Net Micro Framework系统上,让.Net Micro Framework开发板直接访问PLC。
有所不同的是,红牛开发的COM3直接支持RS485通信,这样我们和PLC直接用两个线相连就可以通信了,此外RS485是半双工通信,所以需要自己手动进行收发切换,除此之外和RS232通信代码基本一致。
不同之处的代码如下:
//发...

>> 阅读全文

16位320*240的位图大小为150K字节,而对于EM-STM3210E开发板来说,RAM仅有128K,远不够显示一幅完整位图,红牛的开发板即使有256K的RAM,但是刨去堆、栈及TinyCLR本身所用,剩下的也不多了,所以要显示全屏位图,必须分块显示。
但是这样带来两个问题,一幅图要分块制作,相当繁琐,不过这个可以升级TBConvert程序,让其支持自动分块功能,这个问题算完美解决了。下个问题,从Flash读取需要一定时间,显示也需要一定时间,这样显示全屏位图的过程,就是从上到下,一个一个画块依次显示,效果不太好。幸好LCD驱动,第7个寄存器可以控制显示过程,可以在更新显存数据时,不更新画面,不过这个过程不要太长,否则LCD屏上会有不好看的条文出现。
升级后的TBConvert程序如下,可以设定要分割的块数,注意高度必须要整除块数:
TBConvert 下载地址:http://www.sky-walker.com.cn/yefan/MFV40/TBConvert.exe
针对第二个问题,升级TinyGUI库,增加如下两个函数:
public static void SuspendLayout();//挂起更新
public static void ResumeLayout();//恢复更新
好了,我们用绘图工具,制作三幅240...

>> 阅读全文


无论是蜂鸣器还是LED数码管显示,其实这二者对代码编写来说没有太大区别,都是GPIO的一个典型应用。红牛开发板有一个蜂鸣器,而EM-STM3210E有一个四位LED数码管,代码都相对简单,不值的为二者单独写一篇博文,所以二者合一以一篇文章来说明,不过两个示例代码是独立的。
先说一下蜂鸣器,查原理图,发现控制该蜂鸣器的管脚是PB2,此外值得一提的是和BOOT1插针的1、2脚共用,所以如果你把跳线连接1、2,上电后,蜂鸣器会响。相关代码如下:
public class Buzzer
{
enum GPIO_NAMES {…}
OutputPort BuzzerPort;
public Buzzer()
{
BuzzerPort = new OutputPort((Cpu.Pin)GPIO_NAMES.PB2, false);
}
public void Beep()
{
Beep(500);
}
public void Beep(int millisecond)
{
BuzzerPort.Write(true);
Thread.Sleep(millisecond);
BuzzerPort.Write(false);
Thread.Sleep(millisecond);
}
//仅仅是模拟,效果较差...

>> 阅读全文