This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
您好!
我在项目中使用的是 MSP430FR2153控制器。 我们已经使用控制器开发了定制板。
我是第一次使用 MSP 控制器。 可用于此控制器的任何 GUI 工具。
这是新系列、因此我找不到任何适用于此控制器的 GUI 工具和参考应用手册。
您能不能建议在 不使用 ADC ISR 的情况下如何读取两个以上的模拟通道,有没有任何方法可以这样做。
此致、
Bharat
您好 Bharat、
遗憾的是、没有 GUI 工具。
但是,请查看 Resource Explorer (位于 CCS 中的"Help>Getting Started"菜单中)或直接联机。 有一些示例展示了如何为此器件执行此操作。 下面是 其中一个示例的链接。
您好!
在本示例中、使用 ADC ISR 方法进行 ADC 读取我想在不使用 ISR 的情况下读取 ADC、例如序列转换方法。
请帮我提供不使用 ADC ISR 的按序列转换读取示例代码 ADC。
此致、
Bharat
Bahrat、您好!
这应该适合您。 无中断。 我在 Launchpad 上设置它、它可以正常工作。
// 8位 ADC 转换结果数组
unsigned char adc_result[3];
int main (空)
{
//停止 WDT
WDTCTL = WDTPW | WDTHOLD;
//配置 ADC A0~2引脚
SYSCFG2 |= ADCPCTL0 | ADCPCTL6 | ADCPCTL7;
//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;
//配置 ADC
ADCCTL0 &=~ADCENC; //禁用 ADC
ADCCTL0 |= ADCMSC | ADCSHT_2 | ADCON; // 16ADCclks、ADC 打开
ADCCTL1 |= ADCSHP | ADCSHS_0 | ADCCONSEQ_1; //软件开始转换,重复序列
ADCCTL2 &=~ADCRES; // 8位转换结果
ADCMCTL0 |= ADCMSC | ADCINCH_7 | ADCSREF_0; // A0~7 (EOS);Vref=VCC
ADCIE &=~ADCIE0; //无中断
ADCCTL0 |=(ADCENC | ADCSC); //开始转换
while (!(ADCIFG & ADCIFG0));
ADC_Result [2]= ADCMEM0; //读取转换结果
//从最高通道开始
ADCCTL0 |=(ADCENC | ADCSC); //开始下一次转换
while (!(ADCIFG & ADCIFG0));
ADC_Result [1]= ADCMEM0;
ADCCTL0 |=(ADCENC | ADCSC); //开始最后一次转换
while (!(ADCIFG & ADCIFG0));
ADC_Result [0]= ADCMEM0;
while (1);
}
您好 Dennis、
感谢您的支持。
SYSCFG2 |= ADCPCTL0 | ADCPCTL6 | ADCPCTL7;在 MSP430FR2153冷却器中不可用。
如果我在2153控制器中将最高的 ADC 配置为 ADC1、则 ADC1和 ADC0的读数正常。
但我想使用 ADC8、ADC5、ADC1和 ADC0、这样会在序列转换中产生问题。
如果我将最高 ADC 定义为 ADC8、则所有 ADC 值都不正确。
我不明白为什么2153系列中不提供单个 ADC 配置位。
如果您有任何建议、请帮助我。
此致、
Bharat
您好 Bharat、
[引用 USER="Bharat Chauhan"] SYSCFG2 |= ADCPCTL0 | ADCPCTL6 | ADCPCTL7; 在 MSP430FR2153 控制器中不可用。[/quot]
SYSCFG2 ADC 通道适用于 MSP430FR2433、这就是我拥有的功能。 很抱歉造成混淆。
好的、让我们看看您是否可以获得 我最初指向的示例代码。 您必须修改 PxSEL 位以匹配要使用的模拟通道、然后使用最高通道设置 ADCMCTL0。
如果可以的话、请告诉我。
您好 Dennis、
你是对的。
但是、如果我将 ADCMCTL0 寄存器中的最高 ADC 配置为 ADC1、则 ADC1和 ADC0的 ADC 读数值正常。
但我想使用 ADC8、ADC5、ADC1和 ADC0。
因此、我将 ADCMCTL0 寄存器中的最高 ADC 配置为 ADC8、因此我对所有所需 ADC 的读取不正确。
在序列模式下、ADC 读取从最高通道到 A0值发生。 但有些模拟通道用于不同的用途。
请提出解决此问题的任何想法。
此致、
Bharat
您好 Bharat、
请尝试以下操作。 我无法在4个模拟输入端提供稳定电压、但我在每个通道上看到的结果会有所不同。
int main (空)
{
WDTCTL = WDTPW | WDTHOLD; //停止 WDT
//配置 ADC A1~2引脚
P1SEL0 |= BIT1 + BIT2 + BI5 + BIT8;
P1SEL1 |= BIT1 + BIT2 + BIT3 + BIT2;
//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;
//配置 ADC
ADCCTL0 |= ADCMSC | ADCSHT_2 | ADCON; // 16ADCclks、MSC、ADC 打开
ADCCTL1 |= ADCSHP | ADCCONSEQ_1 | ADCSSEL_1; // ADC 时钟 ACLK、采样计时器、s/w 三态、单序列
ADCCTL2 &=~ADCRES; //清除 ADCCTL 中的 ADCRES
ADCCTL2 |= ADCRES_2; // 12位转换结果
ADCMCTL0 |= ADCINCH_8 | ADCSREF_1; // A0~2 (EOS);Vref=2V
//配置引用
PMMCTL0_H = PMMPW_H; //解锁 PMM 寄存器
PMMCTL2 |= INTREFEN | REFVSEL_1; //启用内部2V 基准
_DELAY_CYCLES (400); //基准趋稳延迟
__no_operation();
while (1)
{
while (ADCCTL1和 ADCBUSY); //等待 ADC 内核处于活动状态
for (i=8;i>0;i---)
{
ADCCTL0 |= ADCENC | ADCSC; //采样和转换启动
while (ADCCTL1和 ADCBUSY); //等待 ADC 内核处于活动状态
ADC_RESULSE[I-1]= ADCMEM0;
}
_delay_cycles (5000);
__no_operation();
}
}
您好 Dennis、
这对我不奏效。
我在所有 ADC 通道上都出错了。
我在软件中尝试了一个东西、我认为它可以正常工作。
查看代码并返回给我。
if (ADC_Count=1)
{
ADC_DISABLE (ADC_base);
ADC_configureMemory (ADC_base、ADC_INPUT_A8、ADC_VREFPOS_INT、ADC_VREFNEG_AVSS);
ADC_ENABLE (ADC_base);
ADC_startConversion (ADC_base、ADCCONSEQ_3);
while (!(ADCIFG & ADCIFG0));
ADC0 = ADC_getResults (ADC_base);//Temp。 PFC 板的性能
ADC_DisableConversions (ADC_base、ADCCONSEQ_3);
}
if (ADC_Count=2)
{
ADC_DISABLE (ADC_base);
ADC_configureMemory (ADC_base、ADC_INPUT_A1、ADC_VREFPOS_INT、ADC_VREFNEG_AVSS);
ADC_ENABLE (ADC_base);
ADC_startConversion (ADC_base、ADCCONSEQ_3);
while (!(ADCIFG & ADCIFG0));
ADC1 = ADC_getResults (ADC_base);//输入电流感测
ADC_DisableConversions (ADC_base、ADCCONSEQ_3);
}
if (ADC_Count=3)
{
ADC_DISABLE (ADC_base);
ADC_configureMemory (ADC_base、ADC_INPUT_A0、ADC_VREFPOS_INT、ADC_VREFNEG_AVSS);
ADC_ENABLE (ADC_base);
ADC_startConversion (ADC_base、ADCCONSEQ_3);
while (!(ADCIFG & ADCIFG0));
ADC2 = ADC_getResults (ADC_base);//输入电压感测
ADC_DisableConversions (ADC_base、ADCCONSEQ_3);
}
ADC_Count 计数器以1ms 计时器中断递增。
此致、
Bharat
您好 Dennis、
此代码对我无效。
每次我在 ADC 通道上获取错误数据时。
我尝试了一件事、我认为这是正常的。
查看代码并返回给我。
if (ADC_Count=1)
{
ADC_DISABLE (ADC_base);
ADC_configureMemory (ADC_base、ADC_INPUT_A8、ADC_VREFPOS_INT、ADC_VREFNEG_AVSS);
ADC_ENABLE (ADC_base);
ADC_startConversion (ADC_base、ADCCONSEQ_3);
while (!(ADCIFG & ADCIFG0));
ADC0 = ADC_getResults (ADC_base);//Temp。 PFC 板的性能
ADC_DisableConversions (ADC_base、ADCCONSEQ_3);
}
if (ADC_Count=2)
{
ADC_DISABLE (ADC_base);
ADC_configureMemory (ADC_base、ADC_INPUT_A1、ADC_VREFPOS_INT、ADC_VREFNEG_AVSS);
ADC_ENABLE (ADC_base);
ADC_startConversion (ADC_base、ADCCONSEQ_3);
while (!(ADCIFG & ADCIFG0));
ADC1 = ADC_getResults (ADC_base);//输入电流感测
ADC_DisableConversions (ADC_base、ADCCONSEQ_3);
}
if (ADC_Count=3)
{
ADC_DISABLE (ADC_base);
ADC_configureMemory (ADC_base、ADC_INPUT_A0、ADC_VREFPOS_INT、ADC_VREFNEG_AVSS);
ADC_ENABLE (ADC_base);
ADC_startConversion (ADC_base、ADCCONSEQ_3);
while (!(ADCIFG & ADCIFG0));
ADC2 = ADC_getResults (ADC_base);//输入电压感测
ADC_DisableConversions (ADC_base、ADCCONSEQ_3);
}
ADC_Count 在1ms 定时器中断内递增。
此致、
Bharat
您好 Bharat、
很抱歉我的回答有延迟。 我必须订购一些器件、以便修改 launchpad 以确认特定通道上显示的模拟电压是否得到正确测量。 我将对其进行设置和测试、并告诉您可能需要进行哪些更改。
您好 Bharat、
我相信您已经了解了这一点、但我将向其他人发布我的调查结果、以便从中学习。
根据我的调查结果、如果您想在不使用中断的情况下测量多个通道、请选择通道序列 ADCCONSEQ_0
您分配的最高通道编号 ADCMCTL0 |= ADCINCH_8、然后您必须手动执行9次转换、每个通道从8次转换到0次转换。 是的、即使您仅使用通道8、5、1和0、您也必须在两者之间转换通道以满足 ADC 状态机逻辑。 中间其他通道的结果就会被丢弃。
我做了一个实验、在我的 MSP430FR2355 LP 上、我使用配置为模拟输入的通道11、8、4和1、并使用电阻分压器对每个通道施加不同的电压。 然后、我 使用单通道单次转换 ADCCONSEQ_1来测量每个结果、并将结果放在下面的表格中的"单个"列中。
然后、我使用具有9次转换(每通道一次转换)的环路的通道序列重复进行、并将结果放在表中的"序列"列中。 您可以看到、我启用为模拟输入的4个通道具有相同的 ADC 计数。 所有其他的都是"无关"的。
随附了我的代码。
e2e.ti.com/.../msp430fr2355_5F00_adc_5F00_multi_5F00_ch_5F00_no_5F00_interrupts.c