经过多天的摸索,对PSoC的编程有了一定的认识,起初我以为它的编程方法和单片机类似,但看它的源程序,怎么那么多子文件,每个使用的引脚都有单独一个c文件进行配置。
后来发现原来不需要自己手写这些文件的,都是图形化操作,主程序部分需要手动修改一下。
下面以PWM的例子来实际操作一下。
PWM这个例子有官方的例程,我们先分析一下这个程序,然后再在其基础上进行修改。
由于帖子中图片较多,分上下两个帖子来写,这个帖子先对官方的PWM项目进行分析和测试,下个帖子进行修改验证。
首先新建一个PWM例程,如下图Create New Project,跳出窗口选择默认的PSoC 4100选择,Next。
跳出如下窗口,我们选择到第一个Code example,Next。
跳出如下窗口,红色方框内是官方例程,可以看到有ADC、I2C、CapSense、UART等等,我们先选择PWM,Next。
跳出如下窗口,可以更换项目名称和保存的路径,注意要选择
英文路径!!!Finish
此时工程已建好,并自动弹出一个PDF的程序说明,如下图:
我们先来分析一下这个工程,点开后缀为cysch的文件,它类似于一个原理图,可以看到有时钟、PWM、端口、LED和中断组成,如下图:
双击PWM模块,可以弹出其配置对话框,如下图。我们主要关注的是周期和占空比,即图中的Period和Compare。
这里两个值都是65535,理论上是一直高电平,下面的line显示了这一点,但是图中line有缝隙啊?大概是为了区分结束点?
line_n是输出于line电平相反的信号。
我们可以更改一下Compare的值,如下图,改为35535后,可以看到line的占空比相应的发生变化。
另外还可以改一下PWM的对齐方式,如下图,改为右对齐后的变化。
为了不影响原项目,我们先不保存我们的修改,
Cancel退出!!!
我们再来看一下时钟模块,双击它,如下图,也就改改频率。
再来看一下中断模块,双击它,如下图,中断类型可以改,不过我就认识RISING_EDGE是上升沿触发。
下面我们看一下它的主程序:
- /******************************************************************************
- * Function Name: main
- *******************************************************************************
- *
- * Summary:
- * This function:
- * 1. Sets up and enables the PWM interrupt.
- * 2. Starts the PWM Component.
- *
- ******************************************************************************/
- int main()
- {
- /* Enable the global interrupt */
- CyGlobalIntEnable;
- /* Enable the Interrupt component connected to the PWM interrupt output */
- Isr_TC_StartEx(Isr_TC_Handler);
- /* Start the PWM Component */
- PWM_Start();
- for(;;)
- {
- }
- }
复制代码
可以看到主程序很简洁,开启中断,开启PWM,就进入无限循环了,主程序依然是单片机编程的思路
另外还有一个中断服务函数:
- #define BRIGHTNESS_CHANGE (200u)
- /******************************************************************************
- * Function Name: Isr_TC_Handler
- *******************************************************************************
- *
- * Summary:
- * Handles the Interrupt Service Routine for the PWM Component.
- *
- ******************************************************************************/
- CY_ISR(Isr_TC_Handler)
- {
- /* Clear the TC Interrupt */
- PWM_ClearInterrupt(PWM_INTR_MASK_TC);
- /* Decrement the PWM Compare value to increase the LED brightness */
- PWM_WriteCompare(PWM_ReadCompare() - BRIGHTNESS_CHANGE);
- }
复制代码
它大概是每65536计数值中断一次,还记的PWM模块那里的设置吗?
在中断函数里,首先清除中断标值,然后修改一下Compare的值,它应该就是占空比。
修改规则是先读入当前的Compare值,然后用这个值减去一个固定值200,也就是说每次的占空比不断减小,那减小到0呢?溢出?自动变成最大值65535?先不管这么多,反正就是每次中断都修改Compare为不同的值。
好了,项目工程基本分析完毕,我们编译和下载一下该程序,看看效果。
如下图,程序功能是使2.2口的LED逐渐变亮,然后突然熄灭,再逐渐变亮,反复循环。
现在再想一下中断程序,占空比不断减小,高电平时间不断减小(line那条输出),而2.2口的LED又是低电平点亮,正好对应着亮度不断增加。突然熄灭说明Compare存在一个很大的跳变值。嗯,之前分析的还是对的。
对项目的修改与使用见(下篇)。
本文来自论坛,点击查看完整帖子内容。