DSP之Psoc学习小结.docx
《DSP之Psoc学习小结.docx》由会员分享,可在线阅读,更多相关《DSP之Psoc学习小结.docx(15页珍藏版)》请在冰点文库上搜索。
![DSP之Psoc学习小结.docx](https://file1.bingdoc.com/fileroot1/2023-5/29/511be649-a3d0-42b9-833b-83d53ab55c92/511be649-a3d0-42b9-833b-83d53ab55c921.gif)
DSP之Psoc学习小结
Psoc学习小结
什么是Psoc:
可编程+系统+芯片,ΣIP=PSoC
此为Psoc的程序框图
系统
功能
类型
存储器系统
存贮数据和地址数据
FLASH、EEPROM、SRAM
时钟系统
产生、分配和分布时钟
内部主振荡器IMO(InternalMainOscillator)和相位锁相环PLL(PhaseLockedLoop)
电源系统
给数字、模拟供电
●模拟VDDA、数字VDDD、I/OVddiox供电引脚
●数字Vccd和模拟电源Vcca
●活动(Active)、交替活动(AlternateActive)、休眠(Sleep)和冬眠(Hibernate)
IO系统
输入输出模块
●GPIO\SIO\USBIO
●模拟、数字的不同驱动模式
常用模块
特点
数字模块
定时器
固定功能和UDB配置:
后者能实现的模式多,捕获模式可配置
计数器
固定功能和UDB配置:
后者能实现的计数模式多,可选比较输出,具有时能和复位输入
PWM
固定功能和UDB配置:
后者调制模式多,精度高,可以实现死区控制
DFB
24*24乘法器48*48累加器
模拟模块
模拟比较器
输入偏置限制,模式可选,可以运用LUT
运算放大器
可编程SC/CT模块
温度传感器模块
通信模块
总线
同步两线接口(SDA,SCL)100kbps-3.4Mbps,有主从关系
CAN
1Mbps
模数混合模块
A/D
单采样/快速滤波器/连续或快速平均
D/A
4个8位DAC
基础实验:
1.ledpwm实验
A实验目的:
顶层设计涉及到PWM,时钟以及LED的配置,通过配置以上模块实现LED1和LED2的闪烁。
B实验过程:
模块搭建:
其中PWM采用8位UDB输出单路占空比为50%、周期为1.01s的PWM波,驱动LED1,LED2采用软件程序驱动
主程序:
#include
#defineMS_DELAY167u//定义延时
voidmain(void)
{
uint8ledState=0x00;//LED2状态0灭1亮
Clock_1_Enable();//使能时钟
PWM_1_Start();//使能PWM
while
(1)
{
CyDelay(MS_DELAY);//延时
ledState^=0x01u;//标志位取反,0,1变化
LED2_Write(ledState);//控制IO输出
}
}
C实验结果
LED1一秒钟闪烁一次,LED2一秒钟闪烁三次
D讨论与总结
debug查看:
断点查看:
每运行一次循环,ledstate标志位0x000与0x001切换,LED2常亮常暗切换,LED1保持闪烁。
●pwm控制和主程序c控制两种驱动Led的方式实质都与系统时钟有关
●pwm控制灯闪烁频率与pwm模块设置有关,而且通过修改占空比可以调节亮暗时常
●软件控制灯闪烁的频率与延时的设置有关
2.ADCtoLCD实验
A实验目的:
顶层设计涉及到ADC模块以及LCD驱动模块,配置以上模块实现AD采样,并在LCD上显示
B实验过程:
模块搭建:
主程序:
#include
voidUpdateDisplay(uint16voltageRawCount);//更新AD采样
voidmain()
{
uint16voltageRawCount;
ADC_DelSig_1_Start();//启动ADC
LCD_Char_1_Start();//初始化ADC
LCD_Char_1_Position(0,0);//光标移到0行0列
LCD_Char_1_PrintString("VCount:
");//显示字符:
VCount:
ADC_DelSig_1_StartConvert();//开始AD转换
while
(1)
{
ADC_DelSig_1_IsEndConversion(ADC_DelSig_1_WAIT_FOR_RESULT);//等待AD转换完成
voltageRawCount=ADC_DelSig_1_GetResult16();//存储采样数据
if(voltageRawCount>256)//输出数据范围限制
voltageRawCount=0;
UpdateDisplay(voltageRawCount);//显示AD值
}
}
voidUpdateDisplay(uint16voltageRawCount)
{
LCD_Char_1_Position(0,9);//光标移动到0行9列
LCD_Char_1_PrintNumber(voltageRawCount);//显示AD结果
if(voltageRawCount<10)
{
LCD_Char_1_Position(0,10);
LCD_Char_1_PrintString("");//AD10以内,输出两个空格清除上一次显示的百位和十位
}
elseif(voltageRawCount<100)
{
LCD_Char_1_Position(0,11);
LCD_Char_1_PrintString("");//AD100以内,输出两个空格清除上一次显示的百位
}
LCD_Char_1_Position(1,0);
LCD_Char_1_PrintString("ByYSC");
}
C实验结果:
调整电位器位置,LCD显示AD采样值由0到256变化,当电位器超过一定范围时,LCD显示AD采样值为0。
D讨论与总结
电位器的电压经过模拟采样AD转化之后得到采样值,将连接VR的电压线移除后,LCD的采样值会在之前采样点的数值附近跳动,但是不稳定,主要原因是输入悬空,无采样输入。
3.ADCtoUARTwithDAC实验
derived
Risingedge均可以
A实验目的:
顶层设计涉及到ADC,DAC,DMA,运放以及LCD模块,通过控制以上模块,实现串口通讯,以及通过电位器控制LED闪烁频率。
B实验过程:
模块搭建:
主程序:
#include
voidUpdateDisplay(uint16*voltageRawCount);
voidTxHex(uint16voltageRawCount);
constuint8voltageWave[]=
{
0x6D,0x6F,0x71,0x73,0x75,0x77,0x79,0x7B,0x7D,0x7F,0x81,0x83,0x85,
0x87,0x89,0x8B,0x8D,0x8F,0x91,0x93,0x95,0x97,0x99,0x9B,0x9C,0x9D,0x9D,0x9E,
0x9E,0x9F,0x9F,0x9F,0x9E,0x9E,0x9E,0x9C,0x9C,0x9B,0x99,0x97,0x95,0x93,0x91,
0x8F,0x8D,0x8B,0x89,0x87,0x85,0x83,0x81,0x7F,0x7D,0x7B,0x79,0x77,
0x75,0x73,0x71,0x6F,0x6D,0x6B,0x69,0x67,0x65,0x63,0x61,0x5F,0x5D,
0x5B,0x59,0x57,0x55,0x53,0x51,0x4F,0x4D,0x4B,0x49,0x47,0x45,0x43,
0x41,0x40,0x40,0x3F,0x3F,0x3D,0x3D,0x3D,0x3D,0x3D,0x3D,0x3F,0x41,
0x43,0x45,0x47,0x49,0x4B,0x4D,0x4F,0x51,
0x53,0x55,0x57,0x59,0x5B,0x5D,0x5F,0x61,0x63,0x65,0x67,0x69,0x6B
};//直流偏置电压范围数组
voidmain()
{
uint16voltageRawCount;
uint8myChannel;
uint8myTd;
ADC_DelSig_1_Start();//启动AD
LCD_Char_1_Start();//初始化LCD
VDAC8_1_Start();//启动DA
Opamp_1_Start();//启动运放
UART_1_Start();//启动串口通讯
CyDmacConfigure();//初始化TD链表
myChannel=DMA_1_DmaInitialize(1,1,0,0);//初始化DMA通道
myTd=CyDmaTdAllocate();//从创建的链表里配置TD
LCD_Char_1_Position(0,0);
LCD_Char_1_PrintString("VCount:
");
CyDmaTdSetConfiguration(myTd,sizeof(voltageWave),myTd,TD_INC_SRC_ADR);//配置TD
CyDmaTdSetAddress(myTd,(uint16)(voltageWave),(uint16)VDAC8_1_viDAC8__D);//数据传送设置
CyDmaChSetInitialTd(myChannel,myTd);//初始化TD
CyDmaChEnable(myChannel,1);//使能DMA通道
Clock_1_Start();//启动时钟控制DMA传送
ADC_DelSig_1_StartConvert();//开始AD转换
while
(1)
{
ADC_DelSig_1_IsEndConversion(ADC_DelSig_1_WAIT_FOR_RESULT);//等待转换完成
voltageRawCount=ADC_DelSig_1_GetResult16();//存储AD结果
if(voltageRawCount>256)//设置AD采样值范围
voltageRawCount=0;
UpdateDisplay(&voltageRawCount);//LCD输出
TxHex(voltageRawCount);//串口发送
Clock_1_SetDivider((((uint32)voltageRawCount*1000)/(261-(uint32)voltageRawCount))+1000);//用AD值控制分频(分频系数1000~52200)
}
}
voidUpdateDisplay(uint16*voltageRawCount)
{
/*MovethecursortoRow0,Column9*/
LCD_Char_1_Position(0,9);
LCD_Char_1_PrintNumber(voltageRawCount[0]);/*Printtheresult*/
if(voltageRawCount[0]<10)
{
LCD_Char_1_Position(0,10);
LCD_Char_1_PrintString("");
}
elseif(voltageRawCount[0]<100)
{
LCD_Char_1_Position(0,11);
LCD_Char_1_PrintString("");
}
}
voidTxHex(uint16voltageRawCount)//显示4位+h
{
staticchar8consthex[16]="0123456789ABCDEF";
UART_1_PutChar(hex[(voltageRawCount>>12)&0xF]);
UART_1_PutChar(hex[(voltageRawCount>>8)&0xF]);
UART_1_PutChar(hex[(voltageRawCount>>4)&0xF]);
UART_1_PutChar(hex[voltageRawCount&0xF]);
UART_1_PutString("h\r");
}
C实验结果:
AD→LCD模块显示结果与上一个实验的结果一致,DA转化后控制LED闪烁频率,AD采样值越大LED的闪烁频率越低,当AD采样值>256时,LED显示突变为0,LED闪烁频率与AD采样值为0是一样大。
D讨论与总结:
本实验实现了AD和DA转换过程,但是没有串行通讯线以及无法在计算机端运行串口通讯调试工具,无法在电脑端查看AD采样值数据。
此外需要注意一点是,一般软件版本都是向下兼容的,高版本可以实现低版本的功能,Cypress也是如此,但它还存在模块高低版本的区别,配置上有一定变化,如本例的DMA的设置:
DMA_1是1.7版本,DMA_2是1.0版本,设置标签不同,如本例要实现数据发送控制,1.0要将be_request_enabled设置为true,而1.7版本是设置HardwareRequest,经过尝试derived和risingedge两种方式都能实现LED频率变化的驱动,而disabled和level下LED闪烁频率不受电位器控制。
随着CypressCreator的版本的上升,各种模块的版本也变高了,设置过程有所变化,不能按照老版本进行设置。
4其他模块的学习以及功能实现
以下模块仅做了Cypress端的配置过程,并没有进行硬件连接和实验,基本原理都比较简单,与模拟电路中提到的电压跟随器以及运放相关内容相关,不再此赘述。
主程序的设定也比较简单,主要是启动运放模块,因而主程序不单独列出。
✧数字电压表(电流表)
数字电压表在实验3中已经有了,IDAC模块与VDAC模块类似,只是此处输入为电流而已。
✧简单电压跟随器
✧加法器
✧一阶同相低通滤波器
✧方波发生器
✧峰值检测电路