STM32做的64通道數據采集電路 采樣頻率30hz 效果非常
單片機源程序如下:
- //4.4 Repeat-sequence mode
- //Sequence模式時可以設置多個采樣通道。在最后一個通道加上EOS就表明的采樣通道結束位置。中斷允許只需要設置最后一個通道。
- //為了采樣速率盡可能快,可設置MSC,此時當SHI上升沿觸發第一次采樣后,后面的采樣在上一次采樣結束后自動進行。
- #include <msp430x14x.h>
- #include "Config.h" //開發板配置頭文件,主要配置IO端口信息
- //表區
- #define ADCOK 0x01 //B0為ADC12完成轉換標志.
- unsigned char number_table[]={'0','1','2','3','4','5','6','7','8','9','.'};
- //unsigned char display_buffer[]={0x00,0x00,0x00,0x00,'\0'};
- unsigned char display_buffer[]={0x00,0x00,'\0'};
- unsigned char display_buffer2[]={0x00,'\0'};
- //*******************波特率***********300 600 1200 2400 4800 9600 19200 38400 76800 115200const
- //************************************[0]**[1]**[2]*[3]**[4]**[5]***[6]***[7]****[8]***[9]*
- unsigned char BaudrateUBR0[] ={0x6D,0x36,0x1B,0x0D,0x06,0x03, 0xA0, 0xD0, 0x68, 0x45};
- unsigned const char BaudrateUBR1[] ={0x00,0x00,0x00,0x00,0x00,0x00, 0x01, 0x00, 0x00, 0x00};
- unsigned const char BaudrateUMCTL[]={0x22,0xD5,0x03,0x6B,0x6F,0x4A, 0xC0, 0x40, 0x40, 0x4A};
- unsigned int head[] ={0xAA,0x00};
- unsigned int tail[] ={0x55,0x00};
- unsigned char timp; //全局位變量區
- unsigned char gbit; //B0為ADC12完成轉換標志.
- unsigned int ADC[8] ; //ADC12讀出數據數組
- unsigned char contralAD;
- //子程序聲明
- void init (void); //初始化
- void ADC12setup(void); //ADC12初始化
- void BaudrateSetup(unsigned char U0); //UART0初始化
- void timer_A_setup(void); //timer_A初始化
- void data_converter(unsigned char *p,unsigned int vaule); //數據變換
- void data_converter1(unsigned char *p,unsigned int vaule);//數據變換1
- void send_data(unsigned char *p); //串行口發送數組
- void send_adc12_data(unsigned int *p,unsigned int adcn); //發送ADC12數據
- void send_adc12_xieyi(unsigned int *p,unsigned int adcn); //發送ADC12協議
- void Adc12Open(unsigned char doit);
- //*************************************************************************
- // 串口0發送數據函數
- //*************************************************************************
- /*
- void Send_Byte(uchar data)
- {
- while(!(IFG1&UTXIFG0)); //發送寄存器空的時候發送數據
- U0TXBUF=data;
- }
- //*************************************************************************
- // 串口0發送字符串函數
- //*************************************************************************
- void Print_Str(uchar *s)
- {
- while(*s != '\0')
- {
- Send_Byte(*s++);
- }
- }
- */
- //******************************************************************************
- //發送ADC12數據
- //*p為數據區,adcn為數量
- /*
- void send_adc12_data(unsigned int *p)
- {
- unsigned char result[18];
- result[0]=0xAA;
- result[1] = (unsigned char)(p[0] >> 8); //采樣結果,對應板上VR電位器.
- result[2] = (unsigned char)p[0]; //對應預留儀表放器電路,此路默認為空.
- result[3] = (unsigned char)(p[1]>> 8);
- result[4] = (unsigned char)p[1];
- result[5] = (unsigned char)(p[2] >> 8);
- result[6]= (unsigned char)p[2];
- result[7] = (unsigned char)(p[3] >> 8);
- result[8] = (unsigned char)p[3];
- result[9] = (unsigned char)(p[4] >> 8);
- result[10] = (unsigned char)p[4];
- result[11] = (unsigned char)(p[5] >> 8);
- result[12] = (unsigned char)p[5];
- result[13] = (unsigned char)(p[6] >> 8);
- result[14] = (unsigned char)p[6];
- result[15] = (unsigned char)(p[7] >> 8);
- result[16] = (unsigned char)p[7];
- result[17] = 0x55;
- Print_Str(result); //發送數據
- }
- */
- //******************************************************************************
- //******************************************************************************
- //串口接收中斷
- //usart0 interrupt receive function
- #pragma vector=UART1RX_VECTOR
-
- __interrupt void usart1_rx (void)
- {
- while(RXBUF1 != 0)
- {
- while(1);
- }
- ;
- if(RXBUF1==0x43)//0x43開始,0x44停止采集
- {
- LPM0_EXIT;
- ADC12setup();
- //send_adc12_data(ADC,8);
- while((gbit&ADCOK)==0); //等待序列單次完成
- gbit &= ~ADCOK; //清轉換完成標志
-
-
- }
-
- if( RXBUF1 == 0x44 ){ //收到1時,led燈亮,并發送 "led is off"
- Adc12Open(100);
- _BIS_SR(LPM0_bits + GIE); // Enter LPM0, Enable interrupts
- }
-
- }
- //******************************************************************************
- //timer_A設置
- /*
- void timer_A_setup(void)
- {
- TACTL = TASSEL_2+MC_2; //Timer A 時鐘源先為SMCLK,增加方式
- // TACTL = TASSEL_1+MC_2; //Timer A 時鐘源先為ACLK,增加方式
- TACCTL1 = OUTMOD_3; //CCR1輸出模式:PWM置位/復位
- //TACCR1 = 0x0ffff; //CCR1比較值
- TACCR1 = 0xfffff;
- }
- */
- //******************************************************************************
- //UART0初始化 //8Mhz晶體程序不能用.
- /*
- void BaudrateSetup(unsigned char U0)
- {
- unsigned int i;
- if(U0>5) //當U0>5時,啟用XT2
- {
- BCSCTL1 &= ~XT2OFF; //啟動XT2,
- do
- {IFG1 &= ~OFIFG; //清OSCFault標志
- for(i=0xFF;i>0;i--); //延時等待
- }
- while((IFG1 & OFIFG) != 0); //查OSCFault,為0時轉換完成
- BCSCTL2 |= SELS; //SMCLK為XT2
- }
- //UART0
- P1OUT=0x00;
- if(U0>5){UTCTL0=SSEL1;} // Clock Source:SMCLK
- else{UTCTL0=SSEL0;} // Clock Source:ACLK
- UCTL0 &= ~SWRST; // SWRST復位, USART允許
- UCTL0=CHAR; // 8bit
- ME1|=UTXE0 + URXE0; // Enable Tx0,Rx0
- IE1|=URXIE0; // RX enable
- UBR00=BaudrateUBR0[U0]; // 低位分頻器因子
- UBR10=BaudrateUBR1[U0]; // 高位分頻器因子
- UMCTL0=BaudrateUMCTL[U0]; // 波特率調整因子
- P3SEL |= 0x30; // 將P3.4,5使用外圍模塊 = USART0 TXD/RXD
- P3DIR |= 0x10; // 將P3.4設為輸出(發),P3.5默認為輸入(收)
- }
- */
- //*************************************************************************
- // MSP430串口初始化
- //*************************************************************************
- void UART_Init()
- {
- U1CTL|=SWRST + CHAR; //復位SWRST,8位數據模式
- U1TCTL|=SSEL1; //SMCLK為串口時鐘
- U1BR1=baud_h; //BRCLK=8MHZ,Baud=BRCLK/N
- U1BR0=baud_l; //N=UBR+(UxMCTL)/8
- U1MCTL=0x00; //微調寄存器為0,波特率9600bps
- ME1|=UTXE1; //UART0發送使能
- ME1|=URXE1; //UART0接收使能
- U1CTL&=~SWRST;
- IE1|=URXIE1; //接收中斷使能位
-
- P3SEL|= BIT4 + BIT5; //設置IO口為第二功能模式,啟用UART功能
- P3DIR|= BIT4; //設置TXD0口方向為輸出
- }
- //*************************************************************************
- // ADC Setup函數
- //*************************************************************************
- //4.4 Repeat-sequence mode
- //Sequence模式時可以設置多個采樣通道。在最后一個通道加上EOS就表明的采樣通道結束位置。中斷允許只需要設置最后一個通道。
- //為了采樣速率盡可能快,可設置MSC,此時當SHI上升沿觸發第一次采樣后,后面的采樣在上一次采樣結束后自動進行。
- void ADC12setup(void)
- {
- P6SEL |= 0xff; //使用A/D通道 A0,A1,A2,...,A7
- //ADC12CTL0 = ADC12ON+MSC+SHT0_8; // Turn on ADC12, extend sampling time
- // to avoid overflow of results
- ADC12CTL0 = ADC12ON+MSC+SHT0_0+SHT0_1+SHT0_8+SHT1_8+SHT1_5+SHT1_6+SHT1_7+SHT1_8;
-
- //ADC12CTL1 = SHP+CONSEQ // Use sampling timer, repeated sequence
- ADC12CTL1 = ADC12SSEL_0+SHP+CONSEQ_3+ADC12DIV_7 ; //SAMPCON信號選為采樣定時器輸出
- // Use sampling timer, repeated sequence
- ADC12MCTL0 = INCH_0; // ref+=AVcc, channel = A0
- ADC12MCTL1 = INCH_1; // ref+=AVcc, channel = A1
- ADC12MCTL2 = INCH_2; // ref+=AVcc, channel = A2
- ADC12MCTL3 = INCH_3; // ref+=AVcc, channel = A3, end seq.
-
- ADC12MCTL4 = INCH_4; // ref+=AVcc, channel = A0
- ADC12MCTL5 = INCH_5; // ref+=AVcc, channel = A1
- ADC12MCTL6 = INCH_6; // ref+=AVcc, channel = A2
- ADC12MCTL7 = INCH_7+EOS; // ref+=AVcc, channel = A3, end seq.
-
- ADC12IE = 0x08; // Enable ADC12IFG.3
-
- ADC12CTL0 |= ENC; // Enable conversions
- ADC12CTL0 |= ADC12SC; // Start conversion
- _BIS_SR(LPM0_bits + GIE); // Enter LPM0, Enable interrupts
-
-
- }
- //****************************************************************************
- //打開或關閉ADC12模塊
- //doit: 0:打開 100:關閉
- //****************************************************************************/
- void Adc12Open(unsigned char doit)
- {
- if(doit==0)
- {
- ADC12CTL0 |= ADC12ON;
- ADC12CTL0 |= ENC; //允許轉換
- }
- else if(doit==100)
- {
- ADC12CTL0 &= ~ADC12ON; //不允許轉換
- ADC12CTL0 &= ~ENC;
- }
- }
- //*************************************************************************
- // ADC 中斷函數
- //*************************************************************************
- #pragma vector=ADC12_VECTOR
- __interrupt void ADC12ISR (void)
- {
- static unsigned int index = 0;
-
- ADC[0] = ADC12MEM0; // Move A0 results, IFG is cleared
- ADC[1] = ADC12MEM1; // Move A1 results, IFG is cleared
- ADC[2] = ADC12MEM2; // Move A2 results, IFG is cleared
- ADC[3] = ADC12MEM3; // Move A3 results, IFG is cleared
- ADC[4] = ADC12MEM4; // Move A0 results, IFG is cleared
- ADC[5] = ADC12MEM5; // Move A1 results, IFG is cleared
- ADC[6] = ADC12MEM6; // Move A2 results, IFG is cleared
- ADC[7] = ADC12MEM7; // Move A3 results, IFG is cleared
-
- gbit |= ADCOK; //置標志,表示ADC采樣完成.
- send_adc12_xieyi(head,1);
- send_adc12_data(ADC,8);
- send_adc12_xieyi(tail,1);
- //ADC12CTL0 = ~ENC;
- //TXBUF0 = 0x55;
- //index = (index+1)%Num_of_Results; // Increment results index, modulo; Set Breakpoint here
- }
- void main(void)
- {
- init();
- // Mainloop
- while(1)
- {
- //LPM0;
- ADC12CTL0 |= ADC12SC; // Start conversion
- _BIS_SR(LPM0_bits + GIE); // Enter LPM0, Enable interrupts
- _NOP();
- }
- }
- //******************************************************************************
- //MCU初始化
- void init(void)
- {
- WDTCTL = WDTPW + WDTHOLD; // 停止WDT
- // timer_A_setup(); //timer_A初始化
- //Clock_Init(); //系統時鐘設置
- //P1DIR=0x01;P1OUT=0x0f; //LED設置
- //BaudrateSetup(5); //設置波特率 9600
- //Print_Str("DM430-L Board UART Test...\n"); //發送字符串測試
- // 全局中斷使能
- //ADC12setup();
- //Clock_Init(); //系統時鐘設置
- Clock_Init_Inc;
- //LED8 =0xff; //關滅所有LED
- UART_Init();
- _EINT();
- }
- void data_converter(unsigned char *p,unsigned int value) //數據變換
- {
- //unsigned int m,n,j=0;
- //p[0]=number_table[value/1000];
- p[0]=(unsigned char)(value >> 8);
- // m=value%1000;
- //p[1]=number_table[m/100];
- p[1]=(unsigned char)value ;
- //n=m%100;
- //p[2]=number_table[n/10];
- //j=n%10;
- //p[3]=number_table[j/1];
- }
- //******************************************************************************
- void data_converter1(unsigned char *p,unsigned int value) //數據變換
- {
- p[0]=(unsigned char)value ;
- }
- //******************************************************************************
- //串行口發送數組
- void send_data(unsigned char *p)
- {unsigned int n;
- //timp=RXBUF0;
- for(n=0;p[n]!='\0';n++)
- {
- while ((IFG1 & UTXIFG1) == 0); // USART0發送UTXIFG0=1,表示UTXBUF準備好發送一下字符
- TXBUF1 = p[n];
- }
- }
- //******************************************************************************
- //發送ADC12數據
- //*p為數據區,adcn為數量
- void send_adc12_data(unsigned int *p,unsigned int adcn)
- {
- unsigned int j;
- for(j=0;j<adcn;j++)
- {
- //if(j==0)
- //{
- data_converter(display_buffer,p[j]); //數據變換
- send_data(display_buffer); //發送數據
- // }
- // else
- // {
- // data_converter(display_buffer,p[j]); //數據變換
- // send_data(display_buffer); //發送數據
- // }
- }
- }
- //******************************************************************************
- //******************************************************************************
- //發送ADC12數據頭AA 和 尾55
- //*p為數據區
- void send_adc12_xieyi(unsigned int *p,unsigned int adcn)
- {
- unsigned int j;
- for(j=0;j<adcn;j++)
- {
- data_converter1(display_buffer2,p[j]); //數據變換
- send_data(display_buffer2); //發送數據
- }
- }
- //******************************************************************************
復制代碼
51hei.png (7.04 KB, 下載次數: 47)
下載附件
2020-7-5 19:43 上傳
所有資料51hei提供下載:
AD_Mx_Seq_UART1.rar
(28.72 KB, 下載次數: 17)
2020-7-5 19:18 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|