12回答

1收藏

在阿莫看到的PSOC3学习经验(非常详细)

英飞凌 英飞凌 17446 人阅读 | 12 人回复 | 2012-09-11

首先介绍下:CY8CKIT-003开发板的主芯片是CY8C3866AXI-040,基于高性能的单周期 8051 微处理器内核。开发环境是最新版本的PSOC Creator 1.0  (1.0.0.7727)发布日期是2011/01/12。由于PSOC相比其他单片机,采用图形化开发环境,所以我的分享不涉及单片机的寄存器,采用图片的形式和大家分享。

(原文件名:开发板.jpg)








  






(一)按键检测
任务是实现按键检测,按下时LED1亮,释放是LED1灭。
我们先看看按键连接原理图,是连到P15_3端口上,默认是低电平。

(原文件名:1按键原理图.jpg)
然后我们配置KEY为数字输入,初始为0,带下拉。LED为数字输出,初始1,带上拉。

(原文件名:2KEY端口配置.jpg)

(原文件名:3LED端口配置.jpg)
我们知道按键初始状态为0,而LED初始为1,所以要使用到NOT非门取反,连线如下:最后配置好端口,编译下载。

(原文件名:4指定引脚.jpg)


(原文件名:连线.jpg)
最后编译下载后,是不是非常简单啊










发表于 2011-3-19 18:21:40 |只看该作者


(二)串口显示
串口是普遍采用的通信接口,在计算机到处可见,又称DB9口。今天我们介绍使用PSOC3的串口与电脑通信。首先我们任意分配串口的引脚,这里我们设置串口的RXD对应P5_2,TXD对应P5_0。好在开发板都把引脚连出来了。
首先我们放置UART模块到顶层设计图中,根据参考说明配置如下图,选择FULL模式,配置通信的波特率,其他默认就好了。然后配置RXD和TXD端口属性如下:

(原文件名:1串口配置.jpg)


(原文件名:2RXD配置.jpg)


(原文件名:3TXD配置.jpg)

(原文件名:4连线后编译.jpg)
按照上图连线后编译,就会出现图左边的两个API函数。下面我们根据里面的API函数构造输出字符串的功能。(以前beta2.0版本出现的问题就是不支持中文显示,只好都写成英文,现在的5.0可以支持中文显示)主函数如下
void delay(uint16 num)
{
        while(num--);
}
void puts(uint8 *s)
{
        while(*s)
        UART_PutChar(*s++);
        UART_PutChar('\r');
        UART_PutChar('\n');
}
void main()
{
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
    UART_Start();
        for(;;)
    {
        /* Place your application code here. */
                //UART_PutChar(0x88);
                puts("Welcome to the PSOC and non-network technology and application communities");
                puts("http://psoc.eefocus.com/");
                delay(50000);
                delay(50000);
                delay(50000);
    }
}

(原文件名:5显示效果1.jpg)


(原文件名:5显示效果2.jpg)


(原文件名:6实物图.jpg)















三液晶显示
我们先看看PSOC关于LCD的介绍:
PSoC 液晶显示屏 (LCD) 驱动器系统是一种高度可配置的外设,能够使 PSoC 直接驱动众多 LCD 显示屏。所有电压都在芯片上生成,从而消除了对外部组件的需求。借助高达 1/16 的复用率,CY8C38 系列 LCD 驱动器系统可以驱动多达 736 个段。此外,PSoC LCD 驱动器模块在设计时还充分考虑了便携器件的省电要求,能够采用不同的  LCD  驱动模式和断电模式来达到省电的目的。PSoC Creator 提供了一个 LCD 段驱动组件。借助组件向导,能够轻松灵活地配置  LCD  资源。您可以指定段引脚和公用引脚以及其他选项。软件能够根据必要的规范对器件进行配置,这得益于 PSoC 器件固有的可编程性。
今天我们就实现字符型LCD的模块,显示英文字符串。首先我们放置模块,并打开帮助文档:

(原文件名:1放置LCD模块.jpg)


(原文件名:2连接端口对应图.jpg)


(原文件名:3连接示意图.jpg)
然后在main函数写入:
void main()
{
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
        LCD_1602_Start();        
        LCD_1602_Position(0,0);
        LCD_1602_PrintString("PSOC and LCD1602");
        LCD_1602_Position(1,0);
        LCD_1602_PrintString("psoc.eefocus.com");
    /* CYGlobalIntEnable; */ /* Uncomment this line to enable global interrupts. */
    for(;;)
    {
        /* Place your application code here. */
    }
}

(原文件名:4实际效果图.jpg)


(原文件名:显示汉字.jpg)











PWM控制LED亮度(四)
我们今天就使用PWM控制开发板上LED灯的亮度。脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。
PSOC3的PWM介绍:
定时器 / 计数器 /PWM 外设是一种 16 位的专用外设,能够提供三种最常用的嵌入式外设功能。几乎所有嵌入式系统都会使用定时器、计数器和 PWM 的某种组合。此 PSoC 器件系列中包含四个定时器、计数器和 PWM 实例,此外,还可以根据需要在通用数字模块 (Universal Digital Block, UDB) 中实例化更多、更高级的定时器、计数器和 PWM。PSoC Creator 允许设计人员选择他们所需要的定时器、计数器和 PWM 功能。该工具集能够利用大多数可用的最优资源。
借助通过 DSI 路由连接的输入和输出信号,定时器/计数器/PWM外设可从多个时钟源中进行选择。借助 DSI 路由,可以通过 DSI访问至任何器件引脚及任何内部数字信号的输入和输出连接。四个实例中的每一个都具有比较输出、终端计数输出(可选互补比较输出)和可编程中断请求线。定时器 / 计数器 /PWM 可配置为自由运行、单触发或受使能输入控制。该外设具有定时器复位和捕获输入,以及控制电压比较器输出的非同步停止输入。该外设全面支持 16 位捕获。
定时器 / 计数器 /PWM 功能包括:
?16 位定时器 / 计数器 /PWM (仅限递减计数)
?可选时钟源
?PWM 电压比较器(可针对 LT、LTE、EQ、GTE、GT 进行配
置)
?在启动、复位和到达终端计数时重新加载周期
?在到达终端计数、比较结果为真或捕获时生成中断
?动态计数器读操作
?定时器捕获模式
?置为使能信号模式时开始计数
?自由运行模式
?单触发模式 (在设定的时间长度结束后停止)
?带死区的互补 PWM 输出
?PWM 输出非同步停止输入
1首先我们放置PWM模块,并设置属性如下:

(原文件名:1PWM设置.jpg)
2分配好端口,我们在main.c加入下面代码
void main()
{
    uint16 led0pwmval=0;
        uint8 dir=1;
        /* Place your initialization/startup code here (e.g. MyInst_Start()) */
        PWM1_Start();
    /* CYGlobalIntEnable; */ /* Uncomment this line to enable global interrupts. */
    for(;;)
    {
        /* Place your application code here. */
                delay(50000);
                if(dir)
            led0pwmval++;//变亮模式
                else
            led0pwmval--;//变暗模式

                if(led0pwmval>150)
            dir=0;
                if(led0pwmval==0)
            dir=1;
                PWM1_WriteCompare(led0pwmval);//更新比较值
    }
}

(原文件名:3效果图.jpg)











按键中断(五)
功能实现按键中断控制LED亮灭。首先放置这些模块,并设置中断为上升沿

(原文件名:1设置中断方式.jpg)
然后在主函数里main.c代码为:
#include <device.h>
CY_ISR_PROTO(waveGen);
void main()
{
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
        
    CYGlobalIntEnable; /* Uncomment this line to enable global interrupts. */
        isr_key_Start();
        isr_key_SetVector(waveGen);
        LED1_Write(1);
    for(;;)
    {
        /* Place your application code here. */
    }
}
CY_ISR(waveGen)
{
        /* Place your Interrupt code here. */
        /* `#START ISR_1_Interrupt` */
        if(LED1_Read())
                LED1_Write(0);
        else
                LED1_Write(1);
        
        /* `#END` */
}























模数转换(六)
CY8C38 器件包含一个 Delta Sigma ADC。此 ADC 能够提供差分输入、高分辨率和卓越的线性度,是音频信号处理和测量应用的绝佳 ADC 选择。转换器的正常操作是 16 位,48 ksps。ADC可以配置为以 180 sps 或更低的数据速率输出 20 位分辨率。在时钟频率固定的情况下,可以牺牲分辨率来换取更快的数据速率。
今天我们就采集一个电位器的电压,并显示到LCD1602上。
首先我们放置ADC模式:设置为连续模式,精度先设置为8位,输入范围为VSS到VDD。

(原文件名:1设置ADC.jpg)

然后我们从参考资料看看,需要配置一下几个函数:

(原文件名:2通供的ADC函数.jpg)
3连接效果图,显示当前电压2.3V

(原文件名:3实际连接图.jpg)



















电压数模转换VDAC(七)
CY8C38 部件包含多达四个数模转换器 (DAC)。每个 DAC 都为8 位,可针对电压或电流输出进行配置。 DAC 支持 CapSense、电源供电调节和波形生成。每个 DAC 都具有以下特性:
?可在 255 个步长范围内调节的电压或电流输出
?可编程步长大小 (范围选择)
?八位校准,能够更正 ±25% 的增益误差
?针对电流输出的源和接收器选项
?电流输出的转换速率为 8 Msps
?电压输出的转换速率为 1 Msps
?本质上是单调的
对于电压 DAC (VDAC),电流 DAC 输出会通过电阻路由。VDAC可以使用两个范围,即 0 到 1.024V 以及 0 到 4.096V。在电压模式下,连接到 DAC 输出的任何负载都应该是纯容性负载(VDAC的输出不会被缓冲)。
对于电压 DAC (VDAC),电流 DAC 输出会通过电阻路由。VDAC可以使用两个范围,即 0 到 1.024V 以及 0 到 4.096V。在电压模式下,连接到 DAC 输出的任何负载都应该是纯容性负载(VDAC的输出不会被缓冲)。
我们就做一个简单的电压输出,然后去测量电压的值
1放置并配置电压模块

(原文件名:1电压模块配置.jpg)



2 主函数设置输出200,换算为实际电压
200/256 ×1.024=0.8V
void main()
{
   
    /* Start VDAC */
    VDAC8_1_Start();

    /* Set the value 200 in VDAC data register */
    VDAC8_1_SetValue(200);//200/256*1.024=0.8V
   while(1);
}
3实际测试的确输出0.8V


(原文件名:电压测试0.8V.jpg)











电流数模转换IDAC(八)
电流 DAC (IDAC) 可针对以下范围进行配置:0 到 32 &micro;A、 0 到256 &micro;A,以及 0 到 2.048 mA。IDAC 可配置为源或接收器电流。我们就使用IDAC控制LED的亮度,模块的框图如下:

(原文件名:1电流框图.jpg)
我们按照下面配置电流为输入模式。

(原文件名:2电路模块设置.jpg)

(原文件名:3效果图.jpg)
void main()
{
    uint8 current=0;
        uint8 buf[3];
        /* Start the LCD component */
    LCD_Char_1_Start();           

    /* Clear LCD Display */
    LCD_Char_1_ClearDisplay();   

    /* Start the IDAC component */
    IDAC8_1_Start();            

    /* Sets the IDAC full scale range to 255&brvbar;&Igrave;A */
    IDAC8_1_SetRange(IDAC8_1_RANGE_255uA);   

    /* Sets the IDAC value to 100 */
    //IDAC8_1_SetValue(100);     

    LCD_Char_1_Position(0,0);
    LCD_Char_1_PrintString("IDAC8 DEMO");
        while(1)
        {
                for(current=0;current<256;current++)
                {
                        delay(50000);
                        IDAC8_1_SetValue(current);
                        sprintf(buf,"%d",current);
                        LCD_Char_1_Position(1,0);
                        LCD_Char_1_PrintString(buf);
                }
        }
}









































电压比较器COMP(九)
CY8C38 系列中的每个器件都包含四个电压比较器。电压比较器具有以下特性:
?输入偏移出厂预设值小于 5 mV
?轨至轨共模输入范围 (Vssa 到 Vdda)
?可使用以下三种模式中的一种在速度和功耗之间进行平衡:快速、慢速或超低功耗
?电压比较器输出可以路由到查询表,以便执行简单的逻辑功能,然后还可以路由到数字模块
?可以选择使电压比较器的正向输入通过低通滤波器。提供了两个滤波器
?电压比较器输入可以连接到 GPIO、DAC 输出和 SC 模块输出
我们今天就使用电压比较器,判断电位器的输入电压是否大于1.6V。1.6V的比较电压,我们直接使用VDAC模块输出。比较的结果我们送到LED上显示。

(1电压比较器)


(原文件名:2LED亮.jpg)


(原文件名:3LED灭.jpg)













运算放大器OP(十)
运算放大器是未赋定运算放大器,可配置为增益级或电压跟随器,或配置为外部或内部信号的输出缓冲区。在任何配置中,输入和输出信号都可以连接到内部全局信号,并使用 ADC或电压比较器进行监控。配置是使用信号和 GPIO 引脚之间的开关实现的。运算放大器具有三种速度模式,即慢速、中速和快速。慢速模式的静态功耗最低,而快速模式的功耗最高。输入具有轨至轨摆动能力。在低电流输出条件下,输出摆动能够实现轨至轨操作 (轨至轨电压各減 / 加  50mV)。当驱动高电流负载 (约为  25  mA)时,轨至轨输出电压只能在轨至轨电压各減 / 加 500 mV 范围內摆动。
我们首先看看电压跟随器模式

(原文件名:1放大器示意图.jpg)


(原文件名:2效果图.jpg)











可编程放大PGA(十一)

(原文件名:1PGA介绍1.jpg)


(原文件名:2PGA介绍2.jpg)


(原文件名:3PGA模块.jpg)


(原文件名:4效果图.jpg)











互阻放大器TIA(十二)

(原文件名:TIA模块使用.jpg)


(原文件名:TIA说明.jpg)


(原文件名:不同放大倍数.jpg)
代码:
#include <device.h>
#include <stdio.h>
#define vmax 1.024//外界参考电压为1.024V
CY_ISR_PROTO(waveGen);//中断函数声明
void delay(uint16 num)
{
        while(num--);
}
void main()
{
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
        uint8 ADC1_value=0;
        float fVolts=0;
        uint8 outputStr[7];
        LCD_1602_Start();//启动LCD1602        
        LCD_1602_Position(0,0);
        LCD_1602_PrintString("RF=20K CF=3.3pF");
        LCD_1602_Position(1,0);
        LCD_1602_PrintString("I=20uA V=     V");
        /* Start the IDAC component */
    IDAC8_1_Start();
        /* Start the TIA component */
    TIA_1_Start();
    /* Set the Resistive feedback to 20k ohms */
    TIA_1_SetResFB(TIA_1_RES_FEEDBACK_20K);

    /* Set the capacitive feedback to 3.3pF */
    TIA_1_SetCapFB(TIA_1_CAP_FEEDBACK_3_3PF);
   

    ADC1_Start();
        ADC1_StartConvert();//开始转换
    CYGlobalIntEnable;  /* Uncomment this line to enable global interrupts. */
    isr_key_Start();
        isr_key_SetVector(waveGen);
        for(;;)
    {
        /* Place your application code here. */
                /* Place your application code here. */
                ADC1_IsEndConversion(ADC1_WAIT_FOR_RESULT);
                ADC1_value = ADC1_GetResult8();
                fVolts = ADC1_value * vmax/255;
                sprintf(outputStr, "%0.7f", fVolts);//格式化为3位小数
                LCD_1602_Position(1,9);
                LCD_1602_PrintString(outputStr);
                delay(50000);
    }
}
CY_ISR(waveGen)
{
        /* Place your Interrupt code here. */
        /* `#START ISR_1_Interrupt` */
        static uint8 count=0;//按键次数
        LCD_1602_Position(0,3);
        switch(count++)
        {
                case 0://放大倍数为20K
                {
                        /* Set the Resistive feedback to 20k ohms */
                    TIA_1_SetResFB(TIA_1_RES_FEEDBACK_20K);
                        LCD_1602_PrintString("20");
                        break;
                }
                case 1://放大倍数为30K
                {
                        TIA_1_SetResFB(TIA_1_RES_FEEDBACK_30K);
                        LCD_1602_PrintString("30");
                        break;
                }
                case 2://放大倍数为40
                {
                        TIA_1_SetResFB(TIA_1_RES_FEEDBACK_40K);
                        LCD_1602_PrintString("40");
                        break;
                }
                default://默认放大倍数为20K
                {
                        TIA_1_SetResFB(TIA_1_RES_FEEDBACK_20K);
                        LCD_1602_PrintString("20");
                        count=0;
                        break;
                }
        }
        
        /* `#END` */
}
/* [] END OF FILE */











状态和控制模块SR/CR(十三)

(原文件名:控制面板.jpg)


(原文件名:说明1.jpg)


(原文件名:说明2.jpg)

//使用中断定时
#include <device.h>
unsigned int num=50000;
CY_ISR_PROTO(waveGen);
void delay_ms(unsigned int time)
{
        num=time;
        while(num);
}
void main()
{
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
        unsigned char num=0;
    CYGlobalIntEnable; /* Uncomment this line to enable global interrupts. */
    isr_delay_Start();
        isr_delay_SetVector(waveGen);
        for(;;)
    {
        /* Place your application code here. */
                for(num=0;num<255;num++)
                {
                        Control_Reg_1_Write(num);
                        delay_ms(100);
                }
               
               
    }
}
CY_ISR(waveGen)//每1ms中断方式一次,也可用于定时1ms
{
        /* Place your Interrupt code here. */
        num--;
        
        /* `#END` */
}
/* [] END OF FILE */











热电偶Thermistor (十七)

(原文件名:1连接原理图.jpg)


(原文件名:测量热电偶.jpg)


(原文件名:触摸后.jpg)


(原文件名:未触摸.jpg)




世代意志的传承,我的梦必将实现!
分享到:
回复

使用道具 举报

回答|共 12 个

倒序浏览

沙发

翔宇

发表于 2012-9-11 20:46:10 | 只看该作者

wyzamazon 发表于 2012-9-11 20:37
这个应该是与非社区的那个

哦,在阿莫看到的,11年3月的一个学习分享,阿莫那应该是原创吧!
世代意志的传承,我的梦必将实现!
板凳

小菜儿

发表于 2012-9-12 09:07:36 | 只看该作者

过去看了下,是参加与非网11年PSoC3大赛之后写的学习经验分享,很不错!
地板

xieyuanfu

发表于 2012-9-12 09:24:46 | 只看该作者

都图形化编程了啊
5#

nemon

发表于 2012-9-12 11:45:53 | 只看该作者

很好!受教了
6#

醉清风-385874

发表于 2012-9-12 15:03:37 | 只看该作者

很好啊,标记下,有板子了再对照着学习…………嘿嘿
做对的事情比做对事情更重要!
7#

翔宇

发表于 2012-9-12 17:24:43 | 只看该作者

醉清风 发表于 2012-9-12 15:03
很好啊,标记下,有板子了再对照着学习…………嘿嘿

呵呵,都一起努力吧!
世代意志的传承,我的梦必将实现!
8#

shensi2727

发表于 2013-10-11 09:59:56 | 只看该作者

厉害!留下了。
9#

feiante

发表于 2013-10-11 10:24:24 | 只看该作者

留着慢慢学。。。。。。。。。
10#

翔宇

发表于 2013-10-11 16:07:19 | 只看该作者

feiante 发表于 2013-10-11 10:24
留着慢慢学。。。。。。。。。

好好学学,加油哦~
世代意志的传承,我的梦必将实现!
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条