⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpa.c

📁 msp430fw427 scan if 模块使用范例(很难找到的)测转速用的
💻 C
字号:

#include <msp430xw42x.h>
#include "ScanIF.h"

#include <msp430xw42x.h>
#include "ScanIF.h"



const unsigned char PSMCalib[] = 
{
    0x00,     
    0x00,    
    0x00,
    0x00,
};

unsigned int WaitCounter;

unsigned int V1;
unsigned int V2;
unsigned int V3;
unsigned int V4;

const unsigned char PSM[] = 
{
    0x00,  // 状态 0
    0x13,  // 状态 1
    0x0C,  // 状态 2
    0x4D,  // 状态 3
    0x04,  // 状态 4
    0x01,  // 状态 5
    0x4C,  // 状态 6
    0x5B,  // 状态 7
    0x52,  // 状态 8
    0x45,  // 状态 9
    0x08,  // 状态 10
    0x0D,  // 状态 11
    0x44,  // 状态 12
    0x05,  // 状态 13
    0x5A,  // 状态 14
    0x09,  // 状态 15
    0x10,  // 状态 16
    0x13,  // 状态 17
    0x4C,  // 状态 18
    0x5B,  // 状态 19
    0x44,  // 状态 20
    0x11,  // 状态 21
    0x5A,  // 状态 22
    0x1B,  // 状态 23
    0x12,  // 状态 24
    0x53,  // 状态 25
    0x18,  // 状态 26
    0x4D,  // 状态 27
    0x52,  // 状态 28
    0x45,  // 状态 29
    0x1A,  // 状态 3+ 0
    0x19   // 状态 31
};
                            

void main(void)
{ 
    //停止看门狗
    WDTCTL = WDTPW + WDTHOLD;
SIFCalib ();
InitScanIF();

    //设置电容
    FLL_CTL0 |= XCAP10PF;
    
    //端口初始化
    P1OUT = 0x00;


    P1DIR = 0xFF;
    P2DIR = 0x7F;
    P3DIR = 0xFF; 
    P4DIR = 0xFF;
    P5DIR = 0xFF;
    P6DIR = 0xFF;
    
    //P2.7设置为SIFCLKG
    P2SEL |= BIT7;
    
    //校正DAC的门限
    SIFCalib(); 
    //初始化SCAN IF
    InitScanIF();
    
    //中断使能
    _EINT();
 while (1)
    {
        //测试SIF0OUT
        if (SIFCTL3 & 0x01)    
        {
            //SIF0OUT=1的场合
            P5OUT |= BIT3; 
        }
        else
        {
            P5OUT &= ~BIT3;
        }
        
        //测试SIF1OUT
        if (SIFCTL3 & 0x02)
        {
            //SIF1OUT=1的场合
            P1OUT |= BIT5; 
        }
        else
        {
            P1OUT &= ~BIT5;  
        }
    
    }
}

void InitScanIF(void)
{ 
    int i;
  
    //设置SCAN IF 通道
    P6SEL |= BIT0;
    P6SEL |= BIT1;
    //定时状态机初始化
    //DAC关闭, CA关闭, 31个SMCLK周期(为两个LC传感器延迟一点个时间)
    SIFTSM0 = 0x8800; 
    //DAC关闭, CA关闭, 1个SIFCLK,激励SIFCH.0
    SIFTSM1 = 0x002C;
    //DAC关闭, CA关闭, 1个ACLK,SIFCH.0
    SIFTSM2 = 0x0424;
    //DAC打开, CA打开, 4个SIFCLK,SIFCH.0
    SIFTSM3 = 0x1934; 
    //DAC打开, CA打开, 14个SIFCLK,SIFCH.0
    SIFTSM4 = 0x4134; 
    //DAC打开, CA打开, 14个SIFCLK,SIFCH.0
    SIFTSM5 = 0x2174;
    //DAC关闭, CA关闭, 1个SIFCLK,激励SIFCH.1
    SIFTSM6 = 0x002D;
    //DAC关闭, CA关闭, 1个ACLK,SIFCH.1
    SIFTSM7 = 0x0425;
    //DAC关闭, CA关闭, 1个ACLK,SIFCH.1
    SIFTSM8 = 0x1935;
    //DAC打开, CA打开, 4个SIFCLK,SIFCH.1
    SIFTSM9 = 0x4135;
    //DAC打开, CA打开, 4个SIFCLK,SIFCH.1
    SIFTSM10 = 0x2175;
    //停止
    SIFTSM11 = 0x0220; 
  
    //初始化SCAN IF接口寄存器
    //DAC和比较器由SIFTSMx控制
    SIFCTL2 = 0x0140;
    //延迟一点时间
    for (i = 0;i <= 857;i++) ; 
    //S1为SIF0OUT,S2为SIF1OUT
    SIFCTL3 = 0x4000;  
    //初始化PSM计数器
    SIFCTL4 = 0x33F0;
    //SIFCLK由SIFTSMx控制,SIFCLK = 1MHz
    SIFCTL5 = 0x0045;  
    //顶事状态矢量
    SIFTPSMV = (unsigned int) &PSM;
    //打开SCAN IF,中断使能
    SIFCTL1 |= 0x1001;
}

void SIFCalib (void)
{
    int i;
    WDTCTL = WDT_ADLY_1000;
    _EINT();
    IE1 |= WDTIE;
    WaitCounter=5;
  
    //等待5秒后开始校正
    while (WaitCounter>0);  
    //看门狗禁止
    WDTCTL = WDTPW + WDTHOLD;
  
    //设置SCAN IF 通道
    P6SEL |= BIT0;
    P6SEL |= BIT1;
    //定时状态机初始化
    //DAC关闭, CA关闭, 31个SMCLK周期(为两个LC传感器延迟一点个时间)
    SIFTSM0 = 0x8800;
  
    //DAC关闭, CA关闭, 1个SMCLK,激励SIFCH.0
    SIFTSM1 = 0x000C; 
    //DAC关闭, CA关闭, 1个ACLK,SIFCH.0
    SIFTSM2 = 0x0404;
    //DAC打开, CA打开, 4个SMCLK,SIFCH.0
    SIFTSM3 = 0x1914;
    //DAC打开, CA打开, 9个SMCLK,SIFCH.0
    SIFTSM4 = 0x4114; 
    //DAC打开, CA打开, 5个SMCLK,测试,SIFCH.0
    SIFTSM5 = 0x2154;
    //DAC关闭, CA关闭, 1个SMCLK,激励SIFCH.1
    SIFTSM6 = 0x000D;
    //DAC关闭, CA关闭, 1个ACLK,SIFCH.1
    SIFTSM7 = 0x0405;
    //DAC打开, CA打开, 4个SMCLK,SIFCH.1
    SIFTSM8 = 0x1915;
    //DAC打开, CA打开, 9个SMCLK,SIFCH.1
    SIFTSM9 = 0x4115;
    //DAC打开, CA打开, 5个SMCLK,测试,SIFCH.1
    SIFTSM10= 0x2155;
    //停止
    SIFTSM11 = 0x0200; 
  
    //初始化DAC的值
    //设置SIFCH.0最大的值
    SIFDACR0 = 0x03FF;
    SIFDACR1 = 0x03FF;
    //设置SIFCH.1最大的值
    SIFDACR2 = 0x03FF;
    SIFDACR3 = 0x03FF;

    //初始化控制寄存器
    //DAC和比较器由SIFTSMx控制
    SIFCTL2 = 0x0140;
    //延迟一点时间
    for (i = 0;i <= 857;i++) ;
    //S1为SIF0OUT,S2为SIF1OUT
    SIFCTL3 = 0x4000;  
    //设置SIFCNT
    SIFCTL4 = 0x0120;
    //打开SIFCLK
    SIFCTL5 = 0x0047;
    //信号处理状态地址
    SIFTPSMV = (unsigned int) &PSMCalib; 
    //SIF_EN设置为1
    SIFCTL1 |= 0x0001;
  
    // 传感器1、
    // 测试1
    while (!(SIFCTL3 & 0x01))
    {  
        for(i = 0;i <= 100;i++) ;
        SIFDACR0=SIFDACR0-1;
        SIFDACR1=SIFDACR1-1;
    }
    V1 = SIFDACR1;  
    SIFDACR0 = 0x200;
    SIFDACR1 = 0x200;  
    //测试2
    while (SIFCTL3&0x01)
    {
        for(i = 0;i <= 100;i++) ;
        SIFDACR0=SIFDACR0+1;
        SIFDACR1=SIFDACR1+1;
    }
    V2 = SIFDACR1;
  
    //平均值
    SIFDACR0 = (V2 + V1) / 2;
    SIFDACR1 = SIFDACR0;
  
    SIFDACR0 = SIFDACR0 + 30;
    SIFDACR1 = SIFDACR1 - 30;
    
    //传感器2
    //测试1
    while (!(SIFCTL3 & 0x02))
    {  
        for(i = 0;i <= 100;i++);
        SIFDACR2=SIFDACR2-1;
        SIFDACR3=SIFDACR3-1;
    }
    V1 = SIFDACR2;
  
    SIFDACR2 = 0x200;
    SIFDACR3 = 0x200;
    //测试2
    while (SIFCTL3&0x02)
    {
        for(i = 0;i <= 100;i++);
        SIFDACR2=SIFDACR2+1;
        SIFDACR3=SIFDACR3+1;
    }
    V2 = SIFDACR3;
    //平均值
    SIFDACR2 = (V2 + V1) / 2; 
    SIFDACR3 = SIFDACR2;
    
    SIFDACR2 = SIFDACR2 + 30;
    SIFDACR3 = SIFDACR3 - 30;
}


#pragma vector=SCANIF_VECTOR
__interrupt void ISR_ScanIF(void)

{
    SIFCTL1 &= ~0x0060;     
}


#pragma vector=WDT_VECTOR
__interrupt void ISR_WDT(void)

{
    WaitCounter = WaitCounter - 1;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -