msp430单片机ad采样1khz信号,得到的多个数据如何存入flash,如何用12864显示信号幅度和频率?

msp430单片机ad采样1khz信号,得到的多个数据如何存入flash,如何用12864显示信号幅度和频率?,第1张

在ad中断中读取 adcmen0 并存到数组或者flash中

一个例子

//*****************************************************************************

// MSP-FET430F261x Demo - ADC12, Single Channel Extended Sample, TA1 Trigger

//

// Description: Sample and convert A0 using Timer_A as sample trigger in

// Extended Sample mode. Put "Num_of_Results" ADC12MEM0 values in results[]

// and Light LED (P1.0) when done.

//

// MSP430F2618

// ---------------

//| |

// Vin -->|P6.0/A0|

//| |

//

// R. B. Elliott / H. Grewal

// Texas Instruments Inc.

// Feb 2005

// Built with IAR Embedded Workbench Version: 3.21A

//*****************************************************************************

#include <判让msp430x26x.h>

#define Num_of_Results 512

int results[Num_of_Results] = {0}

void ADC_Init(void)

void main(void)

{

WDTCTL = WDTPW | WDTHOLD//看门狗 失效

ADC_Init() //初衫春始ADC12

ADC12CTL0 |= ENC// 开始转换

__bis_SR_register(LPM0_bits + GIE) // 进入LPM0

}

void ADC_Init(void)

{

P1DIR = 0xff// set port to outputs 用来观察 无用

P1OUT = 0 // reset port outputs 无用

P6SEL |= 0x01 // select A0 input 设置采集的口

ADC12CTL0 = ADC12ON+REF2_5V+REFON // Setup ADC12 各种设置

ADC12CTL1 = CONSEQ_2+SHS_1 // Timer triggers sampling各掘塌局种设置

ADC12MCTL0 = INCH_0 + SREF_1

ADC12IE = 0x0001// Enable ADC12IFG.0 中断使能

TACCR0 = 1500 // Delay to allow Ref to settle

TACCTL0 |= CCIE // Compare-mode interrupt.

TACTL = TASSEL_1 | MC_1 // TACLK = ACLK, Up mode.

__bis_SR_register(LPM3_bits + GIE) // Wait for delay, Enable interrupts

TACCTL0 &= ~CCIE// Disable timer

P2SEL |= BIT3 // Set for Timer A1

P2DIR |= 0x08

TACCR0 = 7 // Init TACCR0 w/ sample prd=CCR0+1设置ta 定时触发

TACCR1 = 4 // Trig for ADC12 sample &convert

TACCTL1 = OUTMOD_3 // Set/reset

TACTL = TACLR | MC_1 | TASSEL_1 // ACLK, clear TAR, up mode

}

// Timer_A0 Interrupt Service Routine

#pragma vector=TIMERA0_VECTOR

__interrupt void ta0_isr(void)

{

TACTL = 0

__bic_SR_register_on_exit(LPM3_bits)

}

// ADC12 Interrupt Service Routine

#pragma vector=ADC12_VECTOR

__interrupt void ADC12ISR (void)

{

static unsigned int index = 0 //一个不断进入中断 但是值保持的变量 重要

results[index++] = ADC12MEM0// Move results 将的得道 的结果存到数组

if (index == 512)

{

ADC12CTL0 &= ~ENC // Stop conversion 关ad

ADC12CTL0 = 0

ADC12IE = 0

index = 0

P1OUT |= 0x01

}

}

假设工件已经过粗车,且工件余量全部为0.5-1.0mm,材料为45#钢,刀具为菱形外圆车刀:(省略顺序号)

M03 S1200 T0101

M08 G99

G00X0 Z2

G01 Z0 F0.1

G03 X24 Z-24 R15 F0.05

G01 X32 W-15 F0.1

(这一程序段就是切削锥体的,车锥体不用考虑角度,而要通过角度算出坐标,你这个老师已经提供了坐标,所以不用另外计算,X(U) Z(W)是程序的终点坐标,如果你要用Z,那么就是G01 X32 Z-39 F0.1,你不会车锥体,可能是你不明白终点坐标的含意,终点坐标是指一个程序段的刀具要到达的终点,而不是整个程序的终点,起点坐标不用考虑,这里的起激铅点坐标就是上个程序段的终点,通常编程时可以是绝对值编程,也可以是用相对值编程,还可以是绝对值与相对值混合编程,当然老一些的系统不支持混合编程。)

Z-49;

(这种直线插补指令实际上格式是统一的,你也可以把它写成G01 X32 Z-49,因为X32既是这个程序段的终点,又是这个程序段的起点,故可以省略不写,同理,最前面那个G01 Z0 F0.1你也可以把毁信它写成G01 X0 Z0 F0.1,请注意在完全理解后,该省略的东西必须省略掉,编写程序要讲究简明扼要实用)

X16 Z-63

G02 X28 Z-74 R3.5(R7?未经求证R到底是多少才能满足条件!)

。。。

直线插补指令的灵活应用

前面说过编写程序要讲究简明扼要实用,下面我教你个不省略的编法:

工厂要车一根部份直径是10、长度150的小轴,假设后面有装夹部位,前面用活动顶尖顶住。

基本程序是:快速安全地定位到X10 Z2

接下来的指令通常就是:G01 Z-150 F0.1

当初由于刀具很锋利,零件是合格的,未产生中间大,二端小的现象,慢慢随着刀具磨损,就产生了“让刀”,即中间大,二端小,因为二端都有相对刚性的固定,而中间没纤铅轮有固定,假如不想用“跟刀架”,那么完全可以用程序来弥补这个缺陷,程序的编法是:假设中间大0.2

G01 X9.8 Z-75 F0.1

X10 Z-150

...

刚开始刀具锋利时,你可以将X9.8改成X10且不省略X10,第二条指令也不改动,仍然分为二步走,它不会影响数控车床切削,刀具磨损后就将X10改成X9.8即可。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12245730.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-22
下一篇 2023-05-22

发表评论

登录后才能评论

评论列表(0条)

保存