请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:MSP430F5529 你(们)好
我是MSP430系列的新成员,希望能够为我提供任何帮助。
我正在尝试从板载ADC中读取。 但是我有两个问题:
1.对于某些通道值(在switch语句中),不调用中断,因此处理器卡在while循环中等待中断。 (我知道我需要添加代码以使循环超时)
2.对于调用中断的通道值,当我得到结果时,它总是一个小于15的小值。
下面是一些代码(主要基于DriverLib用户指南中的示例代码:
在main()顶部调用的主init函数中
//使用ADC12的内置振荡器初始化ADC12 ADC12_a_init (ADC12_a_base, ADC12_A_SAMPLEHOLDSOURCE_SC, ADC12_A_CLOCKSOURCE_ADC12OSC, //ADC12_A_CLOCKDIVIDEBY_1); ADC12_A_CLOCKDIVIDER_1);
我从ADC读取的函数
uINT16_t READ_ANALOG (int channel){
//打开ADC12
ADC12_a_enable (ADC12_a_base);
//将采样计时器设置为采样和保持16个时钟周期
ADC12_A_setupSamplingTimer(ADC12_a_base,
ADC12_A_CYCLEHOLD_64_CYCLES,
ADC12_A_CYCLEHOLD_4_CYCLES,
0);
//使用指定的参考电压配置内存缓冲区的输入
ADC12_a_configureMemoryParam ={0};
Param.memoryBufferControlIndex = ADC12_a_memory_0 +通道;
param.inputSourceSelect = ADC12_a_input_A0 +通道;
Param.positiveRefVoltageSourceSelect = ADC12_A_VREFPOS_AVCC;
Param.NiverRefVoltageSourceSelect = ADC12_A_VREFNEG_AVSS;
Param.endOfSequence = ADC12_A_NOTENDOFSEQUENCER;
ADC12_A_configureMemory (ADC12_a_base,¶m);
//开始单个转换,不重复或序列。
ADC12_a_startConversion(ADC12_a_base,
ADC12_A_MEMORY_0 +通道,
ADC12_A_SINGLECHANNEL);
//等待中断标志声明
//获取适当的中断ID,同样,如果参数是我们不使用的通道,则返回-1
开关(通道){
案例5:
while (!(ADC12_A_getInterruptStatus(ADC12_a_base, ADC12IFG5));
中断;
案例6:
while (!(ADC12_a_getInterruptStatus(ADC12_a_base, ADC12IFG6));
中断;
案例7:
while (!(ADC12_a_getInterruptStatus(ADC12_a_base, ADC12IFG7));
中断;
案例12:
while (!(ADC12_a_getInterruptStatus(ADC12_a_base, ADC12IFG12));
中断;
案例13:
while (!(ADC12_a_getInterruptStatus(ADC12_a_base, ADC12IFG13));
中断;
默认:
返回(-1);}
//获取值
UINT16_t data = ADC12_A_getResults (ADC12_a_base,ADC12_a_memory_0 + channel);
//禁用ADC
ADC12_a_disable (ADC12_a_base);
return(ddata);}