火辣西米秀

  • 2019-11-10
  • 发表了主题帖: MSP430的倒车雷达设计

         人们对汽车辅助驾驶系统智能化要求的提高和汽车电子系统的网络化发展,新型的倒车雷达应能够连续测距并显示障碍物距离,并具有通信功能,能够把数据发送到汽车总线上去。     以往的倒车雷达设计使用的元器件较多,功能也较简单。本文介绍的基于新型高性能超低功耗单片机MSP430F2274的倒车雷达可以弥补以往产品的不足。    系统总体设计   系统采用超声波测距原理。超声波测距仪器一般由发射器、接收器和信号处理器三部分组成。工作时,超声波发射器发出超声波脉冲,超声波接收器接收遇到障碍物反射回来的反射波,准确测量超声波从发射到遇到障碍物反射返回的时间,根据超声波的传播速度,可以计算出障碍物距离。作为一种非接触式的检测方式,超声波具有空气传播衰减小、反射能力和穿透性强的特点。超声波测距具有在近距离范围内有不受光线和雨雪雾的影响、结构简单、制作方便和成本低等优点。高性能的单片机结合超声波测距,可以实现功能强大、使用方便的倒车雷达。TI公司的16位单片机MSP430F2274功耗极低,片上资源丰富,同时利用JTAG接口技术,可以对片上闪存方便的编程,便于软件的升级,非常适合作为倒车雷达系统的微控制器。倒车雷达系统的框图如图1所示。   图1 倒车雷达系统框图    硬件系统设计   系统以MSP430F2274微控制器为核心,外围电路由超声波发射电路、超声波接收电路、声光报警电路、通信接口电路、键盘液晶显示电路五部分组成,下面逐一介绍。   图2 倒车雷达系统主控电路图   系统的主控电路图如图2所示。本系统中选用的MSP430F2274片内有32Kb闪存和1Kb RAM,因此无须外扩存储器。外接的32.768kHz晶振作为CPU关闭状态Basic-Timer的时钟源,同时也作为系统的车载时钟使用。   超声波发送模块电路如图3所示,由超声波产生和发射两部分组成。超声波的产生方法有两种:硬件发生法和软件发生法。常用的硬件发生法常采用如下方案:超声波由CD4011构成的振荡器振荡产生,经升压变换推动超声波换能器而发射出去,振荡器的起振和停振由单片机来控制。本设计采用软件发生法,因为通过软件发生法既可以减少硬件的复杂程度,降低系统的成本,又具有灵活性强、容易实现、稳定性好的优点。本系统利用MSP430F2274单片机的定时器功能来产生稳定的PWM(40Hz)脉冲波,并通过I/O端口P2.3输出到超声波发射部分。在超声波发射电路中CD4049一共包括了6个非门,图3中线路仅使用了3个,为了防止干扰或被静电击穿导致整个CD4049损坏,把没有使用的那一侧的3个非门串起来做接地处理。当控制端输出一系列固定频率脉冲时,在压电陶瓷型超声波发射换能器UCM-40-T上就固定频率的加正电压和反电压,发出大功率的超声波,所得到的波形比其他方式效果更理想。   图3 倒车雷达超声波发送模块   超声波接收电路如图4所示。这是本系统设计和调试的一个难点。压电陶瓷型超声波接收器 UCM-40-R 接收反射的超声波转换为40kHz毫伏级的电压信号,需要经过放大、处理、才能用于触发单片机中断。一方面传感器输出信号微弱,由于反射条件不同,需要放大倍数的范围大约是100~5000,另一方面传感器输出阻抗较大,需要高输入阻抗的多级放大电路,而高输入阻抗容易接收干扰信号。通常采用两种方案:一是采用运算放大器组成多级选频放大电路;二是采用专用的集成前置放大器。第一种方案容易产生自激振荡,要使接收电路达到很好灵敏度和抗干扰效果,电路的调试是较困难的。本系统采用专用的集成电路前置放大器 CX20106,它由前置放大器、限幅放大器、带通滤波器、检波器、积分器、整型电路组成。其中前置放大器具有自动增益控制功能,可以保证在超声波传感器接收较远反射信号输出微弱电压时放大器有较高的增益,在近距离输入信号强时放大器不会过载。调节芯片引脚5的外接电阻R3,将它的滤波器的中心频率设置在40kHz,达到了很好的效果。当接收到与滤波器中心频率相符的信号时,其输出引脚7输出一个低电平,而输出引脚7直接接到MSP430F2274的P2.2上,以触发中断。   图4 倒车雷达超声波接收模块   图5 倒车雷达声光报警电路图   报警模块采用简单的声光报警电路,如图5所示。先设定一个临界值,当车尾与障碍物的距离小于设定的最小距离时,红色指示灯闪亮,绿色指示灯熄灭。单片机向其端口发出PWM脉冲,随着距离的减小,通过控制PWM脉冲的占空比使闪光和蜂鸣的频率加剧,以此来提示驾驶员。   图6 倒车雷达通信接口电路图   通信接口电路如图6所示。采用美信的MAX3232芯片,外围电路非常简单,只需要5个0.1μF的电容器。该电路把单片机串口输出信号隔离变换成 RS-232信号发送到汽车总线上,同时还可以实现该系统与计算机的通信。   图7 倒车雷达键盘显示电路图   键盘和显示电路如图7所示,由键盘和液晶显示两部分组成。其中键盘采用独立式按键,有3个按键,一个设置键、一个上翻键、一个下翻键。可以进行报警值、工作方式、时钟等各个参数的设置。液晶显示电路采用ZJM12864BSBD这款低功耗的点阵图形式LCD,显示格式为128点(列)×64点(行),具有多功能指令,容易使用,可实时的显示时钟、距离和报警提示信息,方便直观。    系统软件设计   软件采用模块化设计,程序由主程序、测距子程序和键盘显示子程序、时钟显示子程序等多个模块组成,调试过程中对其中每个功能模块和子程序逐一调试,在每个子程序都完成指定的功能后,再进行综合调试。系统的软件流程如图8所示。   图8 系统软件流程图   超声波发射电路发出超声波的同时计数器开始计数,当遇到障碍物反馈信号到超声波接收器接收,经CX20106接收电路处理后,产生一个低脉冲,该信号传送给单片机产生中断,调用测距子程序,计算出测量距离,调用显示子程序,根据不同的测量数值在液晶上显示距离和报警。当距离大于2m,显示“安全”和测量距离,继续测量;当距离小于1m时,显示“危险”和测量距离,由P1.2位驱动蜂鸣器报警;当距离小于2m且大于1m时,显示“注意”和测量距离。为增强抗干扰能力,系统连续发射超声波测量三次,从中剔除最大最小值,取中间值计算出精确的距离。这样每秒可测约三个数据,仍然可以满足实时性要求。    结语   该倒车雷达采用了高性能的MSP430F2274单片机,并充分利用了其片上资源使得系统功能丰富,使用的外围芯片减少,系统可靠性得到提高。该倒车雷达应用于汽车中,当驾驶员倒车时,从液晶显示屏上一目了然便知道障碍物离车的距离,克服了后视镜小,视野窄的缺点,消除了倒车造成的事故隐患。

  • 发表了主题帖: MSP430__基于MSP430学习开发系统的SD卡FAT16读写程序

    ######################################################################## 下面,介绍一下一个 基于MSP430学习开发系统的SD卡FAT16读写程序这个工程 介绍了SD卡的基本结构和技术特征,详细说明了使用MSP430单片机和SD卡设计的FAT16文件系统,给出了接口电路和相应的软件系统设计。 该系统适用于大容量的现场数据采集、存储,并在动态心电图记录系统中得到了应用。 此工程有SCH,程序等。。。。。 ######################################################################## 以下是SCH图:   ########################################################################### 以下是代码,对于MSP430开发主要是多做项目,希望这个项目对大家有用。。。。。   主函数如下:   void main(void) {      hwInterface sdNow;   uint8 ok,i; uint8 Name[12]="SD_FAT16TXT"; uint8 buffer[54]= "If you look this content,the file was created success!";         uint8 rBuf[128];          initMcu();           UCTL1 |= SWRST;                       // Initialize USART state machine     UCTL1 |= CHAR + SYNC + MM;            // 8-bit SPI Master **SWRST**     UTCTL1 = CKPH + SSEL1 + SSEL0 + STC;  // SMCLK, 3-pin mode     UBR01 = 0x04;                         // UCLK/4     UBR11 = 0x00;                         // 0     UMCTL1 = 0x00;                        // no modulation        ME2 |= USPIE1;                        // Enable USART1 SPI mode     UCTL1 &= ~SWRST;                      // Initialize USART state machine           P5DIR |= SDCS;                        //SD cs pin as output      P5SEL |= 0x0E;                        // P5.1-3 SPI option select                sdNow.sectorCount = 1;     sd_Init(&sdNow);          InitFat16();      //    memset(rBuf,0,128); //    sd_readSector(&sdNow,0,rBuf,128); //    rBuf[1] = 0;   ok=CreateFile(Name,(uint32)54); //建立长度为54的空文件 if(ok!=SD_FAIL)  //文件已存在,退出     { WriteFile(Name,(uint32)0,(uint32)54,buffer); //将buffer写入文件     };      /* for(i=0;i<54;i++)buffer[i]=0; ReadFile(Name,(uint32)0,(uint32)54,buffer); //将文件读入buffer   EreaseFile(Name); //删除文件 */     while(1); } SD卡读程序如下 :   int8 sd_readSector(hwInterface *iface,uint32 address, uint8* buf, uint16 len) { uint8 cardresp; uint8 firstblock; uint8 c; uint16 fb_timeout=0xffff; uint32 i; uint32 place;   /*DBG((TXT("sd_readSector::Trying to read sector %u and store it at %p.\n"),address,&buf[0]));*/ place=512*address; sd_Command(iface,CMDREAD, (uint16) (place >> 16), (uint16) place); cardresp=sd_Resp8b(iface); /* Card response */    /* Wait for startblock */ do firstblock=sd_Resp8b(iface);  while(firstblock==0xff && fb_timeout--);   if(cardresp!=0x00 || firstblock!=0xfe){ sd_Resp8bError(iface,firstblock); return(-1); } for(i=0;i<512;i++){ c = if_spiSend(iface,0xff); if(i<len) buf[i] = c; }   /* Checksum (2 byte) - ignore for now */ if_spiSend(iface,0xff); if_spiSend(iface,0xff);   return(0); }   SD写程序如下: int8 sd_writeSector(hwInterface *iface,uint32 address, uint8* buf) { uint32 place; uint16 i; uint16 t=0; /*DBG((TXT("Trying to write %u to sector %u.\n"),(void *)&buf,address));*/ place=512*address; sd_Command(iface,CMDWRITE, (uint16) (place >> 16), (uint16) place);   sd_Resp8b(iface); /* Card response */   if_spiSend(iface,0xfe); /* Start block */ for(i=0;i<512;i++)  if_spiSend(iface,buf[i]); /* Send data */ if_spiSend(iface,0xff); /* Checksum part 1 */ if_spiSend(iface,0xff); /* Checksum part 2 */   if_spiSend(iface,0xff);   while(if_spiSend(iface,0xff)!=0xff){ t++; /* Removed NOP */ } /*DBG((TXT("Nopp'ed %u times.\n"),t));*/   return(0); }

  • 发表了主题帖: MSP430单片机寄存器总结-CPU 寄存器

    1.1 PC——程序计数器 取完指令后CPU根据该指令的字节数自动增量PC,因此20位的PC(R0)的值总是指向下一条要执行的指令。 PC总是指向偶地址(bit0=0) 1.2 SP——堆栈指针 CPU使用20位堆栈指针(SP,也称为R1)来存储子例程调用和中断的返回地址。 【作用】:保护现场和恢复现场。 它使用先进后出方案。 SP由用户初始化为RAM,并且始终与偶数地址对齐。 堆栈分两种: 向上增长,栈底占用较低地址,栈顶占用较高地址 : 8051 向下增长,栈底占用较高地址,栈顶占用较低地址: MSP430、AVR ARM支持两种增长方式的堆栈。 1.3 SR——状态寄存器 用作源或目标寄存器的16位状态寄存器(SR,也称为R2)只能用于通过字指令寻址的寄存器模式。 寻址模式的其余组合用于支持常数发生器。 SCG1:系统时钟发生器1该位可用于根据器件系列启用或禁用时钟系统中的功能; 例如,DCO偏置启用或禁用。 SCG0:系统时钟发生器0该位可用于根据器件系列启用或禁用时钟系统中的功能; 例如,FLL(频率锁定环)启用或禁用。 OSCOFF:关闭振荡器。 该位置1时,当LFXT1 CLK不用于MCLK或SMCLK时,它会关闭LFXT1晶体振荡器。 CPUOFF:CPU关闭。 该位置1时,将关闭CPU。 CPUOFF,OSCOFF,SCGO和SCG1位请求系统进入低功耗模式。 GIE:中断使能总控制位,可以使能/屏蔽可屏蔽中断。 可以使用如下指令配置SR寄存器: //将SR某位置1 __bis_SR_register(); _bis_SR_register(); _BIS_SR(); //将SR某位置0 __bic_SR_register(); _bic_SR_register(); _BIC_SR(); 上述都是内置函数  

  • 2019-11-09
  • 发表了主题帖: MSP-EXP430F5529LP开发板005-PWM库函数+时钟配置

           从32转到MSP430最让我头大的就是它的时钟配置了,参考了一些网上的资料,看了几天终于大概了解了一点。 上面这6点是关键,在后面的时钟初始化时要参考。       本次实验目的是要实现P2.0口输出10kHz的PWM,这也是应用中电机控制的常用工作频率。要输出准确的频率,了解清楚各个时钟是非常必要的。     首先明确思路,430中有三个时钟:辅助时钟ACLK,频率较低,软件选作各个外围模块的时钟信号,一般用于低速外设;系统主时钟MCLK,频率较高,主要用于CPU和系统,类似于主频;子系统时钟SMCLK,主要用于高速外设模块。这里我们利用TIMER_A产生PWM,选择SMCLK作为模块的时钟源,因此SMCLK的设置就是关键。 LaunchPad为430的XT2外接了一个4MHz的时钟源,T1外接了一个32.768kHz的时钟源,本实验的目标除了输出10kHz的PWM,还要将ACLK配置为32.768kHz,MCLK配置为24MHz,SMCLK配置为4MHz。 整体代码如下: //***************************************************************************** #include "driverlib.h" //***************************************************************************** // //Target frequency for MCLK in kHz // //***************************************************************************** #define UCS_MCLK_DESIRED_FREQUENCY_IN_KHZ   24000   //***************************************************************************** // //MCLK/FLLRef Ratio // //***************************************************************************** #define UCS_MCLK_FLLREF_RATIO   6   //***************************************************************************** // //Variable to store current Clock values // //***************************************************************************** uint32_t clockValue = 0;   //***************************************************************************** // //Variable to store status of Oscillator fault flags // //***************************************************************************** //***************************************************************************** // //XT1 Crystal Frequency being used // //***************************************************************************** #define UCS_XT1_CRYSTAL_FREQUENCY    32768   //***************************************************************************** // //XT2 Crystal Frequency being used // //***************************************************************************** #define UCS_XT2_CRYSTAL_FREQUENCY   4000000 //***************************************************************************** // //Desired Timeout for XT1 initialization // //***************************************************************************** #define UCS_XT1_TIMEOUT 50000 #define TIMER_PERIOD 399 #define DUTY_CYCLE  100 #define UCS_XT2_TIMEOUT 50000 uint16_t status; uint8_t returnValue = 0; void main (void) {     //Stop WDT     WDT_A_hold(WDT_A_BASE);       //Set VCore = 1 for 12MHz clock     PMM_setVCore(PMM_CORE_LEVEL_1);//主频提高后,VCore电压也需要随之配置          //Initializes the XT1 and XT2 crystal frequencies being used     UCS_setExternalClockSource(UCS_XT1_CRYSTAL_FREQUENCY,UCS_XT2_CRYSTAL_FREQUENCY);//设置外部时钟源的频率,没什么实际设定       //Initialize XT1. Returns STATUS_SUCCESS if initializes successfully     GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5,GPIO_PIN4 + GPIO_PIN5);//XT1口不作为普通IO     returnValue = UCS_turnOnLFXT1WithTimeout(UCS_XT1_DRIVE_0,UCS_XCAP_3,UCS_XT1_TIMEOUT);//启动XT1       //Startup HF XT2 crystal Port select XT2     GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5,GPIO_PIN2 + GPIO_PIN3);//XT2口不作为普通IO       //Initialize XT2. Returns STATUS_SUCCESS if initializes successfully     returnValue = UCS_turnOnXT2WithTimeout(UCS_XT2_DRIVE_4MHZ_8MHZ,UCS_XT2_TIMEOUT);//启动XT2          //Set DCO FLL reference = REFO     UCS_initClockSignal(UCS_FLLREF,UCS_XT2CLK_SELECT,UCS_CLOCK_DIVIDER_1);//XT2作为FLL参考          //Set Ratio and Desired MCLK Frequency  and initialize DCO     UCS_initFLLSettle(UCS_MCLK_DESIRED_FREQUENCY_IN_KHZ,UCS_MCLK_FLLREF_RATIO);//MCLK设置为24MHz          //Set ACLK = REFO     UCS_initClockSignal(UCS_ACLK,UCS_REFOCLK_SELECT,UCS_CLOCK_DIVIDER_1);//ACLK设置为32.768kHz          UCS_initClockSignal(UCS_SMCLK,UCS_XT2CLK_SELECT,UCS_CLOCK_DIVIDER_1);//SMCLK设置为4MHz       //P2.0 as PWM output     GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2,GPIO_PIN0);       //Generate PWM - Timer runs in Up mode     Timer_A_outputPWMParam param = {0};     param.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;     param.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_1;     param.timerPeriod = TIMER_PERIOD;     param.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1;     param.compareOutputMode = TIMER_A_OUTPUTMODE_RESET_SET;     param.dutyCycle = DUTY_CYCLE;     Timer_A_outputPWM(TIMER_A1_BASE, &param);       // Enable global interrupt     __bis_SR_register(GIE);       //Verify if the Clock settings are as expected     clockValue = UCS_getMCLK();     clockValue = UCS_getACLK();     clockValue = UCS_getSMCLK();       //Loop in place     while (1) ; } 运行结果如下,输出占空比25%,10kHz的方波。

  • 2019-11-06
  • 发表了主题帖: MSP430应用技巧4:创建MSP430Ware工程项目的方法

      此软件架构指TI公司的MSP430Ware有别于日志介绍的MSP430Ware++,大家在阅读的时候要注意。我们在使用MSP430Ware的时候,首先应从TI官方网站上下载,然后安装即可,本文介绍基于MSP430Ware的工程项目的创建方法。     1、启动CCS,可以见到如下画面,在硬盘上建立工程文件目录,然后将CCS的workspace直接指向该文件家即可,该文件夹应该为空,点击OK即可。     2、进入CCS主界面后,选择File-New-CCS Project项目,如下图所示。     3、在下图中对项目进行设置,设置后点击Finish。     4、工程建立后,就可以查看MSP430Ware的TI官方文档,进行使用了。  

  • 2019-10-13
  • 发表了主题帖: Arduino遥控套装解决你的所有问题

    最近制作了一个基于Arduino的遥控器和配套的接受板,可以用在一些遥控小车或者机器人上面,用的无线方案使最常见的NRF24L01,接受板使用的是ATmega328P控制器,遥控器使用的是ATmega8A控制器 ,这一章我带来遥控器的制作过程。 这次我设计了一个遥控器的板子,体积很小,整个版面只有9.6mm*4.6mm,可以称的上是掌上遥控器,并且常用功能都不少。 设计篇 首先当然是对整个遥控器的功能规划,先定目标,就是我的成品需要达到什么功能,这样方便之后设计中可以保证我们目标的专一以及成品后就可以按照我的目标表去一一核对我的目标功能是否全部达标。 1.单片机选择 对于单片机我是选择atmega8,其实atmega328也可以选择,但是价格上贵一些,但是遥控器这样简单的设备来说用不着328那么大的内存,所以选择Mega8。两个芯片的引脚分部都是一样的,所以后期可以更换单片机芯片,而不用改变电路结构,下面是Atmega8的引脚图。 2.无线通讯模块 采用的还是NRF24l01这款无线模块,在某宝上有许多版本的NRF24l01,我使用的是采用DIP2*4引脚输出的这款,据说还有一款加载了功率放大器的板子,接口是兼容的,所以如果后期想增加遥控距离的话可以采用带功放的模块。 关于给它供电的电路,还是使用MIC5205的方案,我在许多项目中都会用到它,体积小巧(采用SOT23-5封装)并且输出电流足够(150ma),外围电路足够简单,两个电容即可。不过大家在选择电容的时候注意它的最大承受电压,一般商家会在参数里面标注,我选择的是耐压10V的10uf电容。 3.摇杆 首先是作为一个遥控器,该有的比例控制摇杆肯定必须有,这样我们就可以操控一些比例通道(例如电机速度,灯的亮度,舵机旋转角度以及所有需要连续变化的量)。参照市面上的常用设计来看,设计两个全向摇杆是比较好的选择(类似于PS2手柄上的摇杆)关于摇杆的原理,我简单的介绍一下: 其实摇杆的本质就是让摇杆的转轴连接着一个电位计,使用电位计对摇杆进行定位,这样我们通过读取电位计的电压值就可以计算出摇杆的位置。如果是全向摇杆,一般就会有两个电位计去对摇杆在X轴和Y轴上的位置进行定位,这样使用单片机的ADC即可读取到电压,从而得知摇杆的位置。 那么每一个摇杆都有两个运动轴,两个摇杆就有四个运动轴,这样我就可以用两个摇杆去控制四个比例通道了。 4.按键 对于四个比例通道的控制显然不够用,有些项目也需要开关量的控制(比如灯的开关,模式的切换)于是我设计了两个额外的按键开关,可以用来控制一些开关量。 关于按键开关的检测电路我在这里直接将按键开关的两个引脚分别连接到GND和单片机的引脚,没有设置上拉电阻的原因是我会使用单片机内部的上拉电阻,所以不再需要外接上拉电阻,这样也节省了版面空间。 对于引脚的连接是需要分外注意的一点,一定要和单片机的外部中断引脚连接,这里讲解一下原因:如果不使用中断引脚去检测按键开关的状态话,由于按键操作的时间很短,这容易造成单片机在运行其他程序的时候错过按键检测的程序,这样按键的按下就无法检测到。如果按键连接在中断引脚,这样无论单片机在执行什么程序,都可以第一时间停止执行当前程序,进入中断服务程序去执行按键指令。对于Atmgea8来说,有两个外部中断引脚,于是我将这两个按键连接到这两个引脚上。 5.boost升压电路 这一次给Atmega8供电的电路是采用E50D方案的升压电路,最大输出电流800ma左右,足够使用了。在这里提醒一句,由于E50D工作频率在300khz左右,所以大家在布线的时候注意和低频线路的隔离。图中的二极管选择的是肖特基二极管,有着速度快的特性。 6.供电 在遥控器的供电上我好不犹豫选择了18650锂电池,这种规格的电池是市面上最常见的(许多充电宝里面都会用到)而且内阻也低,体型规整,方便布线以及固定。具体哪个牌子的18650锂电效果好,据说松下的电池不错,但是价格感人。。:L所以我用了神火的18650,先试试,不行的话换其他家的。 7.充电电路 充电芯片的话,对于一节锂电池的方案大家还是比较统一的,某宝上搜18650充电板一搜一大把,但是究其使用的充电IC,基本上都是TP4056。不仅便宜而且用起来反响不错,唯一问题就是发热有点大。。。 我放出我的电路图,大家如果有想设计充电电路的也可以借鉴一下。 R2连接在PROG引脚,用来设定充电电流,充电电流的设定可以参考公式:I=1/R*1200来设定,CHRG是充电状态指示引脚,当充电进行时,为低电平,充电完成后为高阻态。充电的接口用的就是micro usb,这样使用手机充电器就可以充电。 8.电压检测 关于电池保护电路我也想过,但是想到这是遥控器,万一低电量的时候保护板把输出断开了怎么办?(保护电路会在电池低电量的时候断开输出电压)那样岂不是会造成失控的后果?于是我放弃了使用保护电路,改为使用电压检测电路,这样当电池低电压的时候,可以维持整个系统的运作一段时间而不会立刻断电,从而提醒使用者更换电池。:lol 电压检测电路的话很简单,直接连接到atmega328的A0引脚,用ADC采样电压值。而关于报警电路,我使用555构成单稳态触发器,可以控制蜂鸣器断续鸣叫。 9.USB转TTL电路 因为使用了micro usb接口,索性再添加一个USB转TTL电路,这样烧写程序和充电就可以共用一个接口了,使用起来方便了许多。 至于TTL芯片的选用,自然是考虑CH340系列芯片了,使用范围很广而且比较稳定,在CH340的产品线中也有很多不同型号的,使用比较多的是CH340G以及CH340C的型号,但是由于他们使用的是SOIC16的封装,体积较大,所以我采用了CH340E,是CH340中最小的一款,外围电路简单,十分适合我的项目。 其中TNOW表示串口正在发送,高电平有效,于是我接了一个LED灯来指示串口的状态,这样的设计在一些USB转TTL模块上也比较常见。 10.预留接口 由于遥控器上不会涉及到太多的外接设备,这一次我仅仅预留了少许的接口。因为Atmega8需要烧写bootloader,所以我预留了一个烧写的接口,方便以后烧写。对于I2C接口我也有预留,主要是方便以后连接led显示屏使用 原理图绘制好了之后就是导出绘制PCB板了,因为要手持操作,所以对于外形还是很重要的,我绘制了一个长方形的边框,并把四周倒圆角,这样摸起来不会刮手。 经过一个多小时的布线以及摆放元件位置,我完成了设计: 这里有个改进的地方,就是发现这个电池盒的封装不对,于是又绘制了新的封装,并且将图纸发到工厂去了。。。 工厂制板中。。。。。。。。。 工厂制板中。。。。。。。。。 工厂制板中。。。。。。。。。 焊接测试篇 拿到了板子,接下来就是焊接的环节了,大家注意,一般正规PCB厂家发回来的板子都是真空包装的,这样可以防止焊盘被氧化,所以大家一定不要将所有的板子一股脑全部拿出来,我的习惯是焊几片我就拿几片出来,这样可以有效防止焊盘氧化。 下面就是刚刚寄回来的板子,用真空包装袋装着,热腾腾的: 当时为了焊接的方便,我将所有的元件基本上都放在了板子的一面,这样可以避免焊接时候需要板子两边翻来翻去的问题,也可以减少麻烦。 在选取电池的时候,我也在18650和锂聚合物电池两者之间0徘徊过,两者的最大区别就是外形,一个扁平长方形一个是圆柱形,但是考虑到握持手感的问题,如果使用锂聚合物可能会比较单薄,所以我特地用了18650电池,这样手握起来会比较饱满。我把18650电池盒的位置放在了板子的最下部。 介绍完了整体的布局,下面就是焊接过程了。对于焊接过程,并没有什么困难,关键就是对于引脚较密集的芯片的焊接,我使用了助焊剂,这样可以保证焊点不会出现粘连以及不饱满的现象。 在这次设计中我设计了USB转TTL芯片的位置,原因是充电和烧写程序正好可以公共用一个端口,这样节省了版面空间。对于芯片的选择,大家各执己见,但是我综合了我的板子情况考虑后,我选择了CH340E,仅仅需要几个外围滤波电容即可完成整个电路,这应该是市面上体积最小的USB转TTL方案,大家也可以考虑采用。 在设计中,我提到了两款ATMEGA系列芯片,一款是ATMEGA28,一款就是ATEMGA8,两者具有相同的引脚排布以及外围电路,区别就是内部资源的多少。但是对于我的遥控器来说,使用ATMEGA328显然是大才小用,因为整个板子只会涉及到ADC采样以及SPI总线通信(与NRF24L01)所以价格低廉的ATMEGA8是我最好的选择。 最后就是摇杆了,摇杆我使用的是PS2手柄上用的摇杆,某宝价格在3元一个左右,我的一个板子需要两个摇杆。 整个板子焊接完成大概用了一个多小时,然后就是对板子的测试了,关于充电功能,我设计的是充电红灯亮,充好电之后红灯熄灭,下面是测试结果。 充好电之后,将开关拨动到N的位置,可以看到电源红灯亮,说明E50D升压电路正常工作中。。。

  • 发表了主题帖: TMS320F28035 ECAN中断发送与接收

    本帖最后由 火辣西米秀 于 2019-10-13 16:39 编辑        在熟知CAN设置后,才能进一步引入中断,显然,这是TI芯片can的进阶。        TI can中断的作用在于,发送请求后,内部启动发送,发送完成之后,触发中断,进入中断里面,进行置位清零标志位;接收到匹配的ID数据后,触发中断,进入中断内,也进行置位清零,获取数据的操作。两个中断进入后,都需对PIE 组9进行置位清零的操作。        在实际调试中,我看到,就算接收邮箱中断进不去,但通过仿真,还是可以在MBOX中查看匹配的接收邮箱ID,具体查看是这一条: TestMbox3 = ECanaMboxes.MBOX16.MSGID.all;//从外部接收邮箱16的ID,16为接收邮箱(CANMD)        根据can指导手册来看,设置中断启动需要进行几个步骤,在查询上进行添加修改,即可,具体操作自己查说明,我参考的是《TMS320F28012原理与开发》,《TMS320F28335DSP原理与开发编程》这两份指导说明,另can中断需要在PIE开启需要查询《TMS320F28035 Datasheet》产品说明书。以下开始罗列我的修改: 声明中断函数加: __interrupt void Ecan1ISR(void); __interrupt void Ecan0ISR(void); 主函数main里加入: EALLOW;     ECanaRegs.CANMIM.all = 0x00010003;//open interp  T-0&1    R-16     ECanaRegs.CANMIL.all = 0xFFFF0000;     ECanaRegs.CANGIM.all = 0x00006703;//110 0111 0000 0011  //中断使能     ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;     ECanaShadow.CANMC.bit.STM = 0;    // 0-Normal     ECanaRegs.CANMC.all = ECanaShadow.CANMC.all; EDIS; EALLOW;  // This is needed to write to EALLOW protected registers        PieVectTable.ECAN1INTA = &Ecan1ISR;//R-CAN1  接收后中断函数        PieVectTable.ECAN0INTA = &Ecan0ISR;//T-CAN0  发送后中断函数  EDIS;   // This is needed to disable write to EALLOW protected registers     PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   // Enable the PIE block     PieCtrlRegs.PIEIER9.bit.INTx6=1;     //R-CAN1  接收邮箱     PieCtrlRegs.PIEIER9.bit.INTx5=1;     //T-CAN0  发送邮箱     IER = 0x100; // Enable CPU INT-中断9使能     EINT;//开总中断 for(;;)  {        ECanaRegs.CANTRS.all = 0x00000001;  //发送请求box0  Set TRS for all transmit mailboxes        for(ii=0; ii<100; ii++)//延时        {            for(jj=0; jj<1000; jj++){}        }        ECanaRegs.CANTRS.all = 0x00000002;//发送请求box1        for(ii=0; ii<100; ii++)//延时        {           for(jj=0; jj<1000; jj++){}        }   } 加入中断函数: __interrupt void Ecan1ISR(void)//R  接收后进入的中断 {      DINT;      if(ECanaRegs.CANRMP.all==0x00010000)//RX get after flag and int   BOX16      {         ECanaRegs.CANRMP.all = 0x00010000;//clear GMIF16         TestMbox1 = ECanaMboxes.MBOX16.MDL.all;         if(TestMbox1==0x81010101)//data  发送进来的前4位数据              GpioDataRegs.GPATOGGLE.bit.GPIO5 =1;//标记     }     PieCtrlRegs.PIEACK.bit.ACK9 = 1;     EINT; } __interrupt void Ecan0ISR(void)//T  发送后进入的中断 {    DINT;     //TX over after flag and int   1-2BOX     if((ECanaRegs.CANTA.all == 0x00000001)||(ECanaRegs.CANTA.all == 0x00000002))     {        ECanaRegs.CANTA.all = 0x00000003;//clear GMIF16          }     PieCtrlRegs.PIEACK.bit.ACK9 = 1;     EINT; }       以上就是设置的内容,在我这边是可行的,因此分享出来,仅供参考,有异议讨论,本文章仍是需要自己动手调试理解的  

  • 回复了主题帖: MM32W无线MCU系列产品应用笔记 —— 智能炫彩遥控灯方案

    通过控制灰度来实现视觉上的亮度和颜色变化,红、绿、蓝三个颜色已经很普通了

  • 回复了主题帖: 【DSP】TMS320F28035 ADC例程(软件触发+查询)

    led2015 发表于 2019-10-13 11:26 有时想想,技术这种东西,要是有标题,内容,计划,设计,框图,代码,实验,视频,资料,摘要,说明,补充 ...
    有同感啊 谢谢回复

  • 发表了主题帖: 简简单单---一个TMS320F28035的按键驱动程序

    /************************************     标题:key.h     软件平台:CCS v5.2     硬件平台:毕设控制板     主频:60M *************************************/ #ifndef KEY_H_ #define KEY_H_   #include "PeripheralHeaderIncludes.h" #include <stdio.h>   #define delay_cheak 15000   #define KEY1     1 #define KEY2     2 #define KEY3     3 #define KEY4     4 #define noKEY    0   #define KEY1_on        GpioDataRegs.GPADAT.bit.GPIO19 == 0 #define KEY2_on        GpioDataRegs.GPADAT.bit.GPIO6 == 0 #define KEY3_on        GpioDataRegs.GPADAT.bit.GPIO12 == 0 #define KEY4_on        GpioDataRegs.GPADAT.bit.GPIO16 == 0 #define KEYs_on           (GpioDataRegs.GPADAT.all & 0x00091040) != 0x00091040   extern void (*key1_handle)(); extern void (*key2_handle)(); extern void (*key3_handle)(); extern void (*key4_handle)();   void KEY_init(void (*key1_dle)(), void (*key2_dle)(), void (*key3_handle)(), void (*key4_dle)()); char KEY_scanf_handle();   #endif /* KEY_H_ */ /************************************     标题:key.c     软件平台:CCS v5.2     硬件平台:毕设控制板     主频:60M        ********/ #include "key.h"   void (*key1_handle) () = NULL; void (*key2_handle) () = NULL; void (*key3_handle) () = NULL; void (*key4_handle) () = NULL;   void KEY_init(void (*key1_dle)(), void (*key2_dle)(), void (*key3_dle)(), void (*key4_dle)()) {        EALLOW;          GpioCtrlRegs.GPAPUD.all &= (~0x00091040); //除能上拉电阻        GpioCtrlRegs.GPADIR.all &= (~0x00091040);   //输入        GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0;  //GPIO19        GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 2; // 6 samples          GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0;  //GPIO6        GpioCtrlRegs.GPAQSEL1.bit.GPIO6 = 2; // 6 samples          GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;  //GPIO12        GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 2; // 6 samples          GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 0;  //GPIO16        GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 2; // 6 samples          EDIS;          GpioDataRegs.GPASET.all |= 0x00091040;          key1_handle = key1_dle;        key2_handle = key2_dle;        key3_handle = key3_dle;        key4_handle = key4_dle; }   char KEY_scanf_handle() {     char KEY_mun = 0;     if(KEYs_on)         {             DELAY_US(delay_cheak);             if(KEYs_on)             {                    if(KEY1_on)                    {                        (*key1_handle)();                        KEY_mun = KEY1;                    }                    if(KEY2_on)                    {                        (*key2_handle)();                        KEY_mun = KEY2;                    }                    if(KEY3_on)                    {                        (*key3_handle)();                        KEY_mun = KEY3;                    }                    if(KEY4_on)                    {                        (*key4_handle)();                        KEY_mun = KEY4;                    }             }         }     return KEY_mun; }  

  • 发表了主题帖: 【DSP】TMS320F28035 ADC例程(软件触发+查询)

    #include "DSP28x_Project.h" Uint16 ConversionCount; Uint16 Voltage1[10]; Uint16 Voltage2[10]; main() {     InitSysCtrl();     DINT;     InitPieCtrl();     IER = 0x0000;     IFR = 0x0000;     InitPieVectTable();     InitAdc();     ConversionCount = 0;     EALLOW;     AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;    //转换完成前一个ADC时钟周期产生EOC     AdcRegs.INTSEL1N2.bit.INT1E     = 1;    //使能ADCINT1     AdcRegs.INTSEL1N2.bit.INT1CONT  = 0;    //关闭连续模式     AdcRegs.INTSEL1N2.bit.INT1SEL   = 1;    //将ADCINT1映射到EOC1     AdcRegs.ADCSOC0CTL.bit.CHSEL    = 0;    //将ADCINA0映射到通道0     AdcRegs.ADCSOC1CTL.bit.CHSEL    = 1;    //将ADCINA1映射到通道1     AdcRegs.ADCSOC0CTL.bit.TRIGSEL  = 0;    //软件触发SOC0     AdcRegs.ADCSOC1CTL.bit.TRIGSEL  = 0;    //软件触发SOC1     AdcRegs.ADCSOC0CTL.bit.ACQPS    = 6;    //设置窗口采样次数     AdcRegs.ADCSOC1CTL.bit.ACQPS    = 6;    //设置窗口采样次数     EDIS;     AdcRegs.ADCSOCFRC1.all = 0x0003;//强制给通道0和1产生SOC信号    for(;;)    {       while(AdcRegs.ADCINTFLG.bit.ADCINT1 == 0){}    //等待EOC1信号(ADCINT1)       AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;        //清除EOC1信号(ADCINT1)       AdcRegs.ADCSOCFRC1.all = 0x0003;//强制给通道0和1产生SOC信号       if(ConversionCount == 9)       {           ConversionCount = 0;       }       else ConversionCount++;       Voltage1[ConversionCount] = AdcResult.ADCRESULT0;       Voltage2[ConversionCount] = AdcResult.ADCRESULT1;    } }  

  • 2019-10-12
  • 发表了主题帖: MSP430F149的IO口

    1 概述 MSP430F149共有6组IO口,每组8bit, IO口的设置包括设置IO功能、方向、输入输出寄存器初值。对IO口不做设置,默认情况下为第一功能,输入模式。 2 常用寄存器 PxDIR 0 输入,1 输出; PxSEL 0 I/O口,1 第二功能; PxOUT,PxIN; PxIES 设置中断触发方式 0上升沿,1下降沿; PxIE 设置中断触发允许0禁止,1允许; PxIFG 中断标志寄存器,需要软件清零。 3 用法 IO口中断: P1,P2口总共有16个IO口均能引发中断,相关寄存器为PXIE(中断允许):0不允许,1允许。PXIES(中断触发岩选择)0上升沿、1下降沿。PXIFG(中断标志寄存器),I0口满足中断时相应位置一,只能通过软件清零。P1和P2分别公用两个中断入口PORT1_VECTOR,PORT2_VECTOR。注意IO口中断模式输入仍为第一功能,PXSEL=0。

  • 2019-10-11
  • 发表了主题帖: TMS320C6000芯片结构图和基本特性

    TMS320C6000 芯片结构图      TMS320C600的基本特性   TMS320C6000产品是美国TI公司于1997年推出的dsp芯片,该DSP芯片定点、浮点兼容,其中,定点系列是TMS320C62xx系列,浮点系列是TMS320C67xx系列,2000年3月,TI发布新的C64xx内核,主频为1.1GHz,处理速度9000MIPS,在图像处理和流媒体领域得到了广泛的应用。   C6000片内有8个并行的处理单元,分为相同的两组。DSP的体系结构采用超长指令字(vliw)结构,单指令字长为32位,指令包里有8条指令,总字长达到256位。执行指令的功能单元已经在编译时分配好,程序运行时通过专门的指令分配模块,可以将每个256为的指令包同时分配到8个处理单元,并有8个单元同时运行。芯片最高时钟频率为300MHz(67xx系列),且内部8个处理单元并行运行时,其最大处理能力可达到1600MIPS。   TMS320C6000的架构   1. CPU架构      2. C6000基本指令集   在“DSP TMS320C6000基础学习(1)”中已经说过:SOP是大部分DSP算法的关键单元。C6000的寄存器包括A,B两组。   我们将看看下面的表达式通过DSP指令是怎么一步步实现的,   Y=∑an*xn withn = 1.。.N   (1)an*xn乘法实现,DSP中有专门的硬件乘法模块,因此只需要一个指令就能完成乘法操作,而且指令周期为1。   其中MPY为乘法指令,.M表示DSP的乘法单元,上面指令执行Y1=a1*x1。   (2)加法实现,ADD指令,加法单元用.L表示,下面指令执行Y=Y+Y1      (3)内存数据装载(上面的操作其实是有问题的,MPY和ADD不能直接操作内存),只能使用如下命令:   LDB *Rn, Rm:转载一个字节(8bits)   LDH *Rn, Rm:装载一个半字(16bits)   LDW *Rn, Rm:装载一个字(32bits)   LDDW *Rn, Rm:装载一个double字(64bits)   其中Rn包含要装载操作数内存地址(32bits)的寄存器,Rm为目标寄存器。装载的DSP执行单元称为.D。   (4)将常量装入寄存器指令——MVKL和MVKH   MVKL const, Rn(低16bits)   MVKH const Rn(高16bits)   const是一个常量或标签值,只能先装低位再装高位。   比如(3)中,先要将操作数内存地址载入Rn中,因为地址长度为32bits,必须依次使用上面的2条指令完成地址到寄存器的载入工作,   MVKL Addr_low8 Rn   MVKL Addr_high8 Rn   (5)综合(1)~(4)指令完成a1*x1的过程      其中pt1和pt2分别为a与x地址。   (6)循环指令   为完成Y=∑an*xn withn = 1.。.N,还有一个循环求和的过程,与其它平台类似,DSP中通过跳转指令和计数器实现循环,实现循环的步骤为:   添加一个标签(下一次要跳转到何处);   添加跳转指令(B);   创建一个循环计数器;   添加一条指令用于对循环计数器更新;   使跳转指令根据计数器的值做相应的跳转;

  • 2019-10-09
  • 发表了主题帖: 单片机在倒立摆控制系统的应用

          倒立摆作为一种典型的控制系统实验装置,具有非线性、自然不稳定等特性,常用来作为检验某种控制理论或方法是否合理的典型方案。一阶倒立摆系统能用多种理论和方法来实现其稳定控制,如PID、自适应、状态反馈、模糊控制及人工神经元网络等多种理论和方法都能在倒立摆系统控制上得到实现。   1系统构成及工作原理   图1为一阶旋转倒立摆结构示意图。直流电机作为唯一的动力装置,与旋臂保持刚性连接,带动旋臂在水平面内旋转,旋臂的一端通过转轴(本系统选用电位器角度传感器)与摆杆连接,摆杆可做垂直于旋臂的圆周运动。在自然状态下,摆杆为竖直下垂状态。倒立摆控制的目的是通过控制直流电动机的运动状态,使摆杆保持倒立状态。   图1倒立摆结构示意图   系统工作原理如下:摆杆摆动时,角度传感器检测摆杆的角度,根据角度传感器的输出特性,其输出电压经A/D转换器转换成电压数字量,该数字量与期望的值进行比较产生偏差,通过单片机对该偏差进行处理,即PID控制运算,根据运算结果产生控制信号控制电机和旋臂的转动,使摆杆的角度与期望的角度更接近。   倒立摆控制系统结构框图如图2所示,单片机(51单片机)为控制器,直流电机为执行器,倒立摆为被控对象,倒立摆角度为被控量,角度传感器和模数转换器构成反馈回路。   图2倒立摆控制系统结构框图   2 倒立摆控制系统的硬件设计   2.1单片机最小系统   该系统中选用了STC90C51单片机,该型单片机   具有以下特点:①八位MCU核,与传统8051兼容;②大容量存储空间,包括64kB程序空间,1280B   SRAM等;③具有4个八位并行I/O口,3个定时/计数器,2个外部中断源和1个全双工UART传输口;④5V供电时,最高支持80MHz振荡频率,具备高速浮点运算能力,适合倒立摆系统等较为复杂的控制系统使用。51单片机最小系统如图3所示。 图3 51单片机最小系统   2.2摆杆角度检测   检测摆杆角度所用到的角度传感器种类非常多,常用的有电位器式角度传感器、光电编码器、陀螺仪模块等。由于电位器式角度传感器原理简单,检测精度取决于所用A/D转换器的精度,成本相对较低,因此,综合多方面要求,本系统选用电位器式角度传感器。   传感器返回的电压信号无法被单片机直接识别,所以需要通过A/D转换,将模拟电压信号转换为二进制数的形式,然后单片机才能计算出偏差,进而产生相应的输出。A/D转换器常用的有8位和12位输出,在本系统中选用8位A/D转换器即可满足控制要求,其型号选用ADC0809,相应电路原理图见图4。 图4 A/D转换电路   A/D转换器的时钟脉冲为单片机ALE引脚输出的脉冲经74LS74芯片分频之后得到,A/D转换器的8位数字信号通过单片机的P0口进行采集与处理。   2.3驱动电路   本系统选用的直流电机额定电压为24V,额定功率为30W,单片机的I/O口不足以提供如此大的驱动能力,故需采用驱动电路。常用的直流电机驱动芯片为L298N,可驱动两路直流电机,最大驱动电压为46V,最大电流2A~3A,满足设计要求。直流电机驱动电路如图5所示。 图5 直流电机驱动电路   图5中,L298N的ENA为使能端,可作为单片机PWM(脉宽调制)控制端,控制直流电机转速;IN1和IN2为信号输入端,OUT1和OUT2为输出端,输出   状态与输入状态对应,控制直流电机转向。输出端的二极管为续流二极管,起保护电动机线圈的作用。   3倒立摆控制系统的软件设计   3.1控制算法   本系统采用PID控制算法,PID算法适用于负荷变化大、容量滞后较大、控制品质要求高的控制系统。PID算法有3个可设定参数,即比例放大系数KP、积分时间常数TI、微分时间常数TD。比例调节的作用是使调节过程趋于稳定,但会产生稳态误差;积分作用可消除被调量的稳态误差,但由于积分饱和等原因可能会使系统振荡甚至使系统不稳定;微分作用能有效地减小动态偏差[4]。其传递函数为:   其中:u(k)为第k个采样时刻的输出;e(k)为第k个采样时刻的偏差值;T为采样周期;KP为比例放大系数;TI为积分时间常数;TD为微分时间常数。   在实时性要求较高的倒立摆系统中,积分作用常常使系统对偏差的调节变慢,使动态相应变慢。因此要尽量弱化或者消除积分作用,使用PD调节规律即可。在该系统中,输入变量为给定值与实际检测到角度的差值,输出变量控制所产生的PWM波形的占空比。由于旋臂、摆杆以及电动机的各项参数很难准确把握,且干扰较多,难以建立精确的数学模型,因此采用试验法整定参数的数值,即根据系统表现出的状态,调节各参数的数值,直至系统达到稳定。   3.2程序流程图   倒立摆系统主程序流程图见图6。其中,U为PID运算的输出值,为输出PWM波形的占空比,由于所选单片机不具备专用PWM输出引脚,需要利用定时器T0模拟其波形输出,定时器T0中断子程序流程图见图7。在本系统中,采样周期选择为10ms,由定时器T1控制,定时器T1中断子程序流程图见图8。   4系统测试   本系统测试所用到的倒立摆模型为自制简易模型,测试过程如下:外力将摆杆拉起至接近倒立状态(与倒立状态相差20°左右);给系统上电,同时撤去外力,观察到摆杆迅速呈倒立状态,经过几次调整,即可长时间保持倒立状态。系统达到稳定状态的效果如图在摆杆保持倒立状态时,施加一扰动,即轻碰摆杆或旋臂,系统经过短时间的调整之后,仍可以自动调节至稳定状态,说明该系统具备较强的鲁棒性。   5结论   本系统采用单片机作为一阶旋转倒立摆系统的控制器,执行了数据采集、数据处理(PID运算)、控制直流电机运行状态等操作,成功使该系统稳定,其经济性和实用性得到了很好的展现。同时也体现了经典PID控制理论在一阶倒立摆系统中使用时良好的控制效果。

  • 发表了主题帖: TI C2000 TMS320F28379D SCID SCIB 的配置与使用

           TI的官方例程里面只给了SCIA的配置而没有给其他的SCI的配置方法 其实这些的配置都是一样的,下面以SCIB和SCID的配置为例并结合数据手册说明一下配置过程:至于一些参数为什么要向程序中那样配置可参考F28379的技术手册和博客最后面的截图(当然了也都是在技术手册中截的) 注:程序中红色的代表需要注意的部分,其他颜色的对应下面相同颜色的函数实现方式 /*****************系统配置*****************/     InitSysCtrl();        // 初始化系统     InitGpio();            // 初始化GPIO    SciIOCfg();            // 初始化SCI   引脚的初始化     /*中断配置*/      DINT; //关闭所有中断     InitPieCtrl();  //初始化PIE 控置寄存器到它们的默认状态。默认所有 PIE 被清除     //失能所有的CPU中断 并清除所有的CPU中断标志:     IER = 0x0000;     IFR = 0x0000;     InitPieVectTable();//用指向shell中断服务例程(ISR)的指针来初始化PIE 向量表。     /*中断向量配置*/     EALLOW;     PieVectTable.SCIB_RX_INT = &scibRxFifoIsr;        //串口B接收中断     PieVectTable.SCID_RX_INT = &scidRxFifoIsr;      //串口D接收中断     EDIS;     /*SCI带FIFO接收中断*/     scib_fifo_init();                     //初始化SCI_B 的FIFO     scid_fifo_init();                    //初始化SCI_D 的FIFO     PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   // Enable the PIE block     PieCtrlRegs.PIEIER9.bit.INTx3 = 1;   // PIE Group 9, INT3,配置sciB 接收中断使能*/     PieCtrlRegs.PIEIER8.bit.INTx7 = 1;   // PIE Group 8, INT7,配置sciD 接收中断使能*/     IER |= M_INT9|M_INT8;                // Enable CPU INT     EINT;   //启用全局中断INTM   下面结合上面的代码对配置过程进行详解: 首先是其中SCI初始化函数的配置程序: 1.SciIOCfg(); void SciIOCfg(void) {     /*SCIB:配置GPIO为上拉和复用功能*/ //注意这里端口引脚的复用需要找数据表中 GPIO Muxed Pins端口复用引脚的第几种复用方式 SCIB为2     //RX--P19     GPIO_SetupPinMux(19, GPIO_MUX_CPU1, 2);     GPIO_SetupPinOptions(19, GPIO_INPUT, GPIO_PULLUP);  //这里应该是GPIO_PULLUP ->1  例程错误 原本例程为GPIO_PUSHPULL ->0  正确应该是GPIO_PULLUP 启用上拉     //TX--18     GPIO_SetupPinMux(18, GPIO_MUX_CPU1, 2);     GPIO_SetupPinOptions(18, GPIO_OUTPUT, GPIO_ASYNC);     /*SCID:配置GPIO为上拉和复用功能*/ //注意这里端口引脚的复用需要找数据表中 GPIO Muxed Pins端口复用引脚的第几种复用方式 SCID为6     //RX--P105     GPIO_SetupPinMux(105, GPIO_MUX_CPU1, 6);     GPIO_SetupPinOptions(105, GPIO_INPUT, GPIO_PULLUP);     //TX--104     GPIO_SetupPinMux(104, GPIO_MUX_CPU1, 6);     GPIO_SetupPinOptions(104, GPIO_OUTPUT, GPIO_ASYNC); }   FIFO初始化函数:scib_fifo_init();      (当然SCID只需把程序中的scib改成scid即可 这里不赘述SCID) void scib_fifo_init(void) {     ScibRegs.SCICCR.all = 0x0007;              // 一个停止位 无回环                                             // 无奇偶校验位 ,8个字符位 ,                                                   // async (空闲线)模式, 空闲线协议     ScibRegs.SCICTL1.all = 0x0003;             // 使能 TX, RX, 内部 SCICLK(SCI时钟),                                                   // Disable RX ERR, SLEEP, TXWAKE     //波特率高低位     ScibRegs.SCIHBAUD.all = 0x0000;     ScibRegs.SCILBAUD.all = SCI_PRD;        // 配置波特率为SCI_PRD     ScibRegs.SCIFFTX.all = 0xE040;        // 使能SCI的FIFO功能,重置SCI,发送重置     ScibRegs.SCIFFRX.bit.RXFFIENA = 1;        // 使能SCI FIFO发送功能     ScibRegs.SCIFFRX.bit.RXFFIL = RXNUM;    // 设定接受位数为RXNUM 0h-10h     ScibRegs.SCIFFRX.bit.RXFFINTCLR =1;        // FIFO计数中断标志位清零     ScibRegs.SCIFFCT.all = 0x00;     ScibRegs.SCICTL1.all = 0x0023;             // 重启sci     ScibRegs.SCIFFRX.bit.RXFIFORESET = 1;    // 重启sci接收fifo }   至于波特率的配置就需要对照官方例程了,注意:时钟为200兆时才正确 如何计算可以在技术手册中找到哦!SCI的官方例程中也是这样计算的 //波特率计算方式 #define CPU_FREQ           200E6 #define LSPCLK_FREQ     CPU_FREQ/4 #define SCI_FREQ        115200 #define SCI_PRD         (LSPCLK_FREQ/(SCI_FREQ*8))-1

  • 2019-10-08
  • 发表了主题帖: 根据数字信号处理器与PC机高速通信的设计

          近些年,随之模拟信号技术性的发展趋势,必须解决的信息量愈来愈大,解决的速率也变快,因而具备髙速特性DSP 集成ic的运用获得了普遍高度重视。而根据DSP 解决的统计数据通常要传送给PC 机开展储存和再解决,那麼就务必处理DSP 与 PC 机中间的高速通信难题。本方案设计以德州仪器(TI)的C5000 系列产品DSP 集成icTMS320VC5416为微控制器,运用Cypress企业出示的USB2.0插口集成icCY7C68001 保持了USB2.0 从机接口设计,进而使PC机与DSP 根据USB2.0 插口保持髙速双重地传送数据。   2 TMS320VC5416 与CY7C68001 EZUSBSX2硬件配置接口设计   系统软件计划方案选用PC机做为上位机,承担USB系统总线上检验到机器设备连接并开展枚举、鉴别的全过程,而且能够根据在PC机上运作手机应用程序来控制参数的传送。USB集成ic做为USB机器设备端,联接DSP与上位机的数据传输。DSP用以保持USB协议书,根据DSP程序编写保持DSP统计数据根据USB插口与PC机通讯,且USB集成ic的描述符载入及各种各样指令情况的解决均根据DSP程序编写保持。   TMS320VC5416 是TI 的这款16bit 指定性能DSP,因为VC5416的功率低、特性高,其分离的指令和数据室内空间使该集成ic具备高宽比的并行操作工作能力,在单周期时间内容许指令和数据一起存储,加上高宽比提升的指令集,促使该集成ic具备很高的与运算速率,一起该集成ic自身 具备丰富多彩的片内存储器資源及其多种多样上面外接设备,因而在建筑界获得了普遍的运用。   Cypress 企业的CY7C68001 EZ-USB SX2 是这款性能、方便使用的USB2.0 插口集成ic,考虑USB2.0 协议书,可工作中在髙速(480Mbps)或飞速(12Mbps)方式下,出示1个操纵端点用以解决USB机器设备的恳求及其4个可配备端点用以传送操纵和网络信号,这4个端点共享资源1个4KB的FIFO室内空间,具有规范的8位或16位外界服务器插口,可无缝拼接联接多种多样规范微控制器,比如说DSP、ASIC和FPGA等,并可依据要求设定为同歩或异步插口,片内集成化锁相环(PLL),该集成ic运用于DSL调制调解器、MP3、SD读卡器、数码科技照机、扫描机、复印机等机器设备。   系统软件的硬件配置接口设计如图所示1、图2图示,二者根据统计数据、地址总线及其读、写电源线等开展通讯,CY7C68001的片选数据信号联接至TMS320VC5416 的I/O室内空间片选数据信号上,CY7C68001 的FIFO拓展在VC5416 的I/O 室内空间上。     根据DSP与PC机中间的高速通信设计方案   开关电源一部分选用一整片1117 将5V 变为3.3V供求平衡CY7C68001EZ-USB SX2,仿真模拟地与大数字地中间选用磁珠联接,校准一部分选用RC电路原理,且集成ic材料上详细介绍有典型值100KΩ和0.1μF。   3 插口实际操作基本原理   CY7C68001 有2个外界插口:   (1) 指令插口:用于浏览CY7C68001 寄存器、Endpoint 0缓冲器,及其叙述表。   (2) FIFOapi接口:用于浏览4个1K字节数的FIFO中的统计数据。   这2个外界插口均能够根据同歩或异步的方法开展浏览。   本设计方案选用异步的方法开展浏览。依据图3 的详细地址分派,运用TMS320VC5416 的四根上位详细地址线(A11、A12、A13)联接CY7C68001 的FIFOAD0/1/2,用于挑选FIFO2、FIFO4、FIFO6、FIFO8及其指令插口,其详细地址表如图所示3图示。CY7C68001的详细地址线FIFOADR[2:0]为100B 时,选定CY7C68001 的指令口(Command)。根据CY7C68001的指令口,能够浏览37个寄存器、Endpoint 0缓冲器(64个字节数FIFO)和叙述表(500个字节数FIFO)等,对这种寄存器开展读写能力方法选用再次寻址方式,即最先根据指令口即将寻址方式的寄存器的子详细地址和实际操作种类(读或写)载入,随后再根据指令口将统计数据读取或载入相对的寄存器。      载入指令口的內容称之为命令字,命令字包括要寻址方式的寄存器的子详细地址,或要载入寄存器的统计数据的高4位或低4位。读指令口务必要跟在给指令口写读命令字以后,读取的为相对寄存器的8位统计数据。因此,寄存器的写实际操作由3 个流程构成:     4 USB 插口的软件开发   USB插口的软件开发由两一部分构成:一要在PC机Windows中运作USB 2.0 UTIlity 专用工具,是1个Windows 图形用户界面手机软件,出示CY7C68001 与Windows 电脑操作系统的插口程序流程,促使CY7C68001的开发设计越来越简易。二要在在DSP中运作嵌入式应用编程代码,出示硬件配置的驱动器,用于管理方法CY7C68001开展不一样方法的数据处理方法,从而实现USB2.0 传送协议书。   4.1 USB 插口的软件开发步骤   USB插口的软件开发,DSP端编码大概包含DSP集成ic复位(vc5416_init 涵数)、USB集成ic复位(sx2_init 涵数)、USB集成ic配备程序流程( s x 2 _ s e t u p 涵数) 及其USB 集成ic统计数据读写能力程序流程(sx2_processdata 涵数),操作流程如图所示4 图示。   DSP集成ic复位(vc5416_init涵数)关键承担设定VC5416的输出功率,配备SWCR及其SWWSR寄存器,另一个本软件系统选用1个GPIO脚位做为68001的校准数据信号,因此还必须进行有关设定。     USB集成ic复位(sx2_init涵数)关键承担消除Buffer堆栈及其使能VC5416 的外界终断INT1,待复位完毕后传出READY终断,这时DSP将描述符载入68001,开展枚举全过程,待枚举根据后传出ENUMOK终断,枚举方法能够选用外界EEPROM根据I2C系统总线通电后从外界导进描述符,也可选用根据运作DSP程序流程从DSP导到68001,本软件系统选用第二类枚举方法。   USB集成ic配备程序流程(sx2_setup涵数)是在指令安全通道(0连接点)接到没法全自动解决的上位机恳求,68001向VC5416传出SETUP终断后实行的程序流程,这时VC5416 根据对SETUP寄存器持续实行八次读操作步骤就能获得8字节数恳求,系统软件能够响应当恳求或STALL该恳求。   USB 集成ic统计数据读写能力程序流程(sx2_processdata 涵数)即PC 机与USB从机器设备端遵循USB传送协议书开展数据通讯。   CY7C68001的详细地址FIFOAD[2:0]为100时,选定CY7C68001的指令插口。针对指令插口的读写能力要分二步开展,即在READY合理时,先根据指令插口载入要寻址方式寄存器的子详细地址和实际操作种类(读或写),以后,在READY再度合理时段2次读写能力指令插口,就能读写能力一个字节的统计数据。   4.2 终断服务项目编程设计关键点   DSP应用1个外界终断脚位(INT1)与CY7C68001的INT脚相接,USB系统总线上造成一连串的主题活动,均会开启相对的终断,如果终断造成,DSP 是从CY7C68001 的Command 嘴中载入相对的值,来分辨造成的是哪种终断。

  • 2019-09-21
  • 发表了主题帖: 三极管偏置电路分析方法

    1.了解基极静态偏置电流作用   偏置电路的作用是给三极管提供基极直流电流,这一电流又称基极静态偏置电流。   只有当三极管工作在放大状态时,才给三极管提供静态偏置电流,而这一电流是保证三极管工作在放大状态的必要条件,静态电流不正常,三极管放大信号的工作就一定不正常,掌握三极管放大器的这一重要特性。   静态工作电流就是没有信号输入放大管时三极管各电极的直流工作电流,这一电流由放大器电路中的直流电源电路提供。   2.基极偏置电路具体分析方法和思路培养   三极管基极偏置电路分析最为困难,掌握下列电路分析方法和步骤可以方便基极偏置电路的分析。   (1)电路分析的第一步在电路中找出三极管的电路符号,如下图所示,然后在三极管电路符号中找出基极,这是分析基极偏置电路的关键一步。   三极管偏置电路分析方法   (2)从基极出发,将基极与电源端(+V端或-V端)相连的所有元件找出来,如下图所示电路中的R1,再将基极与地线端相连的所有元件找出来,如电路中的R2,R2与地线相连,这些元器件构成基极偏置电路的主体电路。   三极管偏置电路分析方法   分析与基极相连的各元件,区别哪些元器件可能是偏置电路中的元器件。电阻器有可能构成偏置电路,电容器具有隔直作用而视为开路,所以在分析基极直流偏置电路中,不必考虑电容器。这一电路中R1和R2构成分压式偏置电路。   三极管偏置电路分析方法   (3)确定偏置电路中元器件后,进行基极电流回路的分析,如上图所示。基极电流回路是:直流工作电压+V→偏置电阻R1一VT1管基极→VT1管发射极一VT1管发射极电阻R3一地线。3.掌握三极管静态电流细节问题   三极管的静态电流大小影响三极管的二个重要参数:三极管噪声和电流放大倍数。   (1)静态电流与放大倍数之间关系。静态电流大小与三极管的噪声大小相关,静态电流大,噪声大,反之则小。   三极管偏置电路分析方法   静态电流大小还与三极管放大倍数相关,如上图所示是基极电流与放大倍数p之间的关系曲线,从图中可以看到,在基极电流为一定值时,放大倍数β为最大,基极电流大于或小于这一定值时,放大倍数p要都下降。不同型号三极管有不同的这样特性曲线,但是很相似。   (2)静态电流与噪声之间关系。在一个多级放大器中,会用到数级单级放大器,这时要求前级放大器中三极管静态电流较小,以降低整个放大器的噪声,因为前级电路的微小噪声都将被后级放大器所放大。      三极管偏置电路分析方法   如图,NPN三极管T1处于基极偏置状态。   首先要了解,三极管的基极偏置电路多应用于开关电路;即应用数字电路的TTL电平来控制三极管的导通和截止;即此时的三极管只有两种工作状态——饱和导通和截止。   然而,基极偏置下的三极管Q点不稳定,容易受到各种因素的影响,如温度等;所以为了保证三极管的工作状态保持在饱和导通和截止状态,即保证三极管充当开关时能够稳定的开和关,一般我们取三极管的增益为10。   利用上面的知识我们就可以进行三极管基极偏置驱动继电器电路的设计了。   首先,我们要了解继电器的一些知识;我举个我从松乐继电器数据手册上看到的数据,当选型12V继电器时,它有155欧姆的电阻,需要77mA的驱动电流。   我们此时可以将继电器看成是一个155欧姆的电阻,并且有77mA的电流流过。即 Ic = 77mA ;   根据 Ic = Ib * 增益 ; 增益为10。   得到 Ib = 7.7mA ;   而,如果我们使用 5V 的MCU,那么此时MCU的控制电平为5V,计算 Rb = 5V / 7.7mA = 650欧姆;   然后,我们个继电器加上续流电路,为MCU端口加上下拉电阻(为了防止MCU复位时的误动作);   就这样,一个基于NPN三极管基极偏置驱动继电器的电路就设计完了。

  • 2019-09-19
  • 发表了主题帖: MM32W无线MCU系列产品应用笔记 —— 智能炫彩遥控灯方案

           基于蓝牙技术的智能灯控方案是智能家居应用重要组成部分,通过连接手机APP可以控制灯的开关、亮度、设定开关时间、统计耗电量等功能。该方案具有控制方便,功能多样,操作迅速,设计开发简单等优势。   硬件资源: LED的驱动分别使用PA9/10/11输出PWM波形控制三极管来驱动RGB灯。通过控制灰度来实现视觉上的亮度和颜色变化,红、绿、蓝三个颜色通道每种颜色各分为255阶亮度,在0时"灯"最弱--是关掉的,而在255时"灯"最亮。当三色数值相同时为无色彩的灰度色,而三色都为255时为最亮的白色,都为0时为黑色控制频率。可以使用几百赫兹到几十K赫兹来进行调节不同色彩的灯光。驱动控制原理部分详见下图:   图1 RGB灯驱动原理图   软件资源: 1、PA9/10/11为TIM1的CH2、3、4的捕获比较输出通道,需要将三个IO工作模式的配置为复用推挽输出,同时配置AF寄存器为TIM1的CH2、3、4功能,TIM1需要配置CH2、3、4为脉冲宽度调制模式。配置方式实现代码如下:   void PWM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure; TIM_OCInitTypeDef  TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA , ENABLE);  GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,GPIO_AF_2); GPIO_PinAFConfig(GPIOA, GPIO_PinSource10,GPIO_AF_2); GPIO_PinAFConfig(GPIOA, GPIO_PinSource11,GPIO_AF_2); TIM_TimeBaseStructure.TIM_Period = 255*100; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  TIM_OC2Init(TIM1, &TIM_OCInitStructure); TIM_OC3Init(TIM1, &TIM_OCInitStructure); TIM_OC4Init(TIM1, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM1, ENABLE); TIM_Cmd(TIM1, ENABLE); TIM1->BDTR |= 0x8000; //上电亮白光 SetLEDLum(0,0,0,100); SetLEDLum(0,0,100,101); }   2、我们在UpdateLEDValueAll函数中调用Led_getInfo(data)来获取RGB的配置信息,data是一个数组指针,数组成员包含RGB三个LED的灰度值(0-255),而Led_getInfo(data)最终通过调用server_rd_rsp(u8 attOpcode, u16 attHandle, u8 pdu_type)函数来获取手机APP发送给我们的信息。根据data信息修改TIM1的CCR2、3、4的大小来调节CH2、3、4三路PWM输出的占空比,进而调节REB的三个LED的亮度,来实现我们对于不同色彩、亮度的需求。详细实现代码如下:   void UpdateLEDValueAll(void) //porting function { int t; unsigned char data[7]; unsigned char EnableLED_Flag = 0; unsigned int Led_Lum_percent = 100; Led_getInfo(data); EnableLED_Flag = data[0]; if(EnableLED_Flag == 0) { TIM_SetCompare2(TIM1,0); //G TIM_SetCompare3(TIM1,0); //B TIM_SetCompare4(TIM1,0); //R } else { Led_Lum_percent = data[6]; t = data[3] * Led_Lum_percent; TIM_SetCompare2(TIM1,t); //Rx100 t = data[2] * Led_Lum_percent; TIM_SetCompare3(TIM1,t); //Gx100 t = data[1] * Led_Lum_percent; TIM_SetCompare4(TIM1,t); //Bx100 } }   我们选用一款通用APP做为控制端,操作流程如下: 1.     手机打开App,会自动开始搜索蓝牙设备名(如MindMotionLED)并连接。 2.     连接成功以后app出现RGB控制界面,可以在APP界面中点选不同区域来改变LED灯的颜色。                           图2 APP界面

  • 2019-09-10
  • 发表了主题帖: C6678的SRIO和FPGA的通信

    设计的板子到了SRIO调试阶段了,在板子上,一片V6和两片6678通过4XSRIO互联,中间没有Switch,总算搞定了相互之间的通信。   首先,感谢Ti论坛提供的SRIO程序范例,但是其硬件平台是EVM板,更多的只能用于loopback测试,但是可以在其基础上修改。 1.初始化DSP的SRIO,主要是对SerDes进行配置,然后是Lane和Speed的配置,最后需要等待FPGA的LinK建立,我们在建立时候碰到一点困难,每次建立并不都是4X,一直没有找到问题,我们使用了一个别的办法来保证link为4X。方法是:判断如果不为4x的话重新训练 2.数据发送,DSP上提供的数据发送方法主要有两种,DirectIO和Message,主要区别为DirectIO需要TX和RX双方知道地址映射关系,而Message是通过Message中mail信息得到数据需要保存的地址,我们使用的为DirectIO方法,6678上提供了8组LSU来进行DirectIO数据发送,每个LSU有6个寄存器,当5th寄存器写完后,数据会发送出去,第6个寄存器主要用于检测当前的LSU状态。LSU还有16(32)个影子寄存器  3.SWRITE/NWRITE/NREAD:对DSP来说,初始化完SRIO后,FPGA便可以通过SRIO来发送数据,但是要注意,Designer并不知道什么时候FPGA会发送数据,所以通常会先发送一个DoorBell信息来告知DSP,FPGA要发送数据了,DoorBell可以触发中断,对于NREAD来说,FPGA发送这个命令后,DSP会自动的将请求的数据发送出去,Designer也并不知道数据发送出去,这些都需要DoorBell来支持。   1 问题: 你好,我们现在也能DSP发数据到fpga,但是存在如下问题:    dsp用Nwrite给fpga写数据,fpga能收到数据但是没有响应数据给dsp?(请问需不要两边都确认下 读写的地址??)   dsp用Nread给fpga发,尝试着读取fpga里的数据,但是fpga这边没反应?   fpga主动发起给dsp读写数据,dsp那边该怎么写程序啊?   答:    采用DirectIO模式,FPGA不会主动响应的    DSP发送Nread命令,FPGA应该使用用户接口将Nread命令中请求的地址空间中的数据发送出去    可以采用先发送Doorbell,再发送数据   2 问: 现在我们已经能dsp主动发起对fpga进行读写,但可是fpga无法主动发起对dsp进行读写? 不知道fpga这边需要怎样配置ip核才能实现 dsp,fpga都能主动发起读写数据请求?? 答: 如果没记错的话,FPGA发送NREAD命令就可以了,DSP会自动将数据发送过去,注意NREAD命令中的地址是DSP的实际访问地址   3 问: 你好,请问用DirectIO传输数据是用DMA传输的吗? 这个需要寄存器配置还是直接默认的就是? 还有,FPGA这端有没有DMA这个说法?需不需要进行配置啊? 答: 应该不需要 FPGA没有DMA这个东西 一般FPGA的DMA都是和上位机配合完成的本身没有DMA的吧

  • 2019-09-09
  • 发表了主题帖: 用MCU的PWM产生负电压的教程

         我们应该知道,有一种开关电源是通过PWM波来实现的,但你知道通过PWM波也能输出负电压吗?   负电压的产生电路图原理      在电子电路中我们常常需要使用负电压,比如我们在使用运放的时候常常需要建立一个负电压。下面就简单的以正5V电压到负电压5V为例说一下它的电路。        通常需要使用负电压时一般会选择使用专用的负压产生芯片,但这些芯片都比较贵,比如ICL7600、LT1054、MC34063等。MC34063使用的最多了,关于34063的负压产生电路这里不说了,在datasheet中有的。下面请看我们在单片机电子电路中常用的两种负电压产生电路。            现在很多MCU都带有PWM输出,在使用单片机的时候PWM很多时候是没有用到的,用它辅助产生负压是不错的选择。         上面的电路是一个最简单的负压产生电路了。使用的原件是最少的了,只需要给它提供1kHz左右的方波就可以了,相当简单。这里需要注意这个电路的带负载能力是很弱的,同时在加上负载后电压的降落也比较大。   由于上面的原因产生了下面的这个电路:     负电压产生电路分析         电压的定义:电压(voltage),也称作电势差或电位差,是衡量单位电荷在静电场中由于电势不同所产生的能量差的物理量。其大小等于单位正电荷因受电场力作用从A点移动到B点所做的功,电压的方向规定为从高电位指向低电位的方向。         说白了就是:某个点的电压就是相对于一个参考点的电势之间的差值。V某=E某-E参。一般把供电电源负极当作参考点。电源电压就是Vcc=E电源正-E电源负。   想产生负电压,就让它相对于电源负极的电势更低即可。要想更低,必须有另一个电源的介入,根本原理都是利用两个电源的串联。电源2正极串联在参考电源1的负极后,电源2负极就是负电压了。     一个负电压产生电路:利用电容充电等效出一个新电源,电容串联在GND后,等效为电源2,则产生负电压。     1、电容充电:当PWM为低电平时,Q2打开,Q1关闭,VCC通过Q2给C1充电,充电回路是VCC-Q2-C1-D2-GND,C1上左正右负。   2、电容C1充满电。     3、电容C1作为电源,C1高电势极串联在参考点。C1放电,从C2续流,产生负电压。   当PWM为高电平时,Q2关闭,Q1打开,C1开始放电,放电回路是C1-C2-D1,这实际上也是对C2进行充电的过程。C2充好电后,下正上负,如果VCC的电势为5点几伏,就可以输出-5V的电压了。    

最近访客

< 1/2 >

统计信息

已有11人来访过

  • 芯币:241
  • 好友:--
  • 主题:81
  • 回复:6
  • 课时:--
  • 资源:--

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言