主题中讨论的其他器件:MSP-FET430UIF、 CD74HC4511、 MSP-FET
你好、
改装一台旧机器让我困扰了几个星期的难题。
在我的代码中看不到毛刺脉冲,因此可能在 MSP-FET430UIF 接口应用手册中看到我错过的内容。
简单的 a2d 转换器、可显示3块7段共阴极 LED 显示屏。
MSP430F2132至 CD74HC4511 (单/ 7段)。
无多路复用、简单切换解码器使能。
用于目标内调试的 MSP-FET430UIF 接口。
A2D 输入来自3.3V 供电的10k 电位器、在 A4输入引脚的电位计抽头上具有1k 电阻器。
所有未使用的 MSP430F2132 I/O 引脚接地。
由台式稳压电源提供的目标 cct 电源、在目标板上额外添加了滤波稳压器(5V 和3.3V)。
示波器显示了平坦直流电压波形。
CD74HC4511使能信号是直接来自 MSP430F2132的3.3V 信号、所有 CD74HC4511的5V 电压都在其主电源上提供支持。
CCT 返修是干净的、没有任何短路、所有导联都完好无损、并将导联送至应有的位置。
情况是代码在初始化时运行顺畅、并通过 MSP-FET430UIF 从 PC 运行到目标。
7段数字是稳定的、不同于标准电位器输入器件预期的位1 (0至1至0)上的随机抖动。
当 cct 独立运行时、a2d 值为任何低于稳定值的值、显示值的差异高达100+。
独立=从 PC 和 MSP-FET430UIF 接口断开、MSP430F2132引脚7 (RST)连接高电平、所有 cct 器件通过台式电源激活
认为这是一个时序问题或可能的噪声问题。
已尝试:
- POT 上的二极管+和-
输入电位计+/-上的各种齐纳二极管、以稳定读数
高精度10转10K 电位器
ADC10SC、SMCLK、MCLK 时钟参数和用于 a2d 转换的所有时钟分频器
-raw a2d 值直接到 CD74HC4511
将 a2d 值直接缩放到 CD74HC4511
-将 a2d 值解码为单独的数字、以传输到 CD74HC4511
-多种延迟序列,可减缓/加快显示和 a2d 进程
-在独立操作期间、逐渐降至每位数1秒的照明仍然会产生非静态显示
隔离接地以否定接地环路
-5V 独立接地台式电源、用于运行 CD74HC4511器件
不同 PC
系统中集成的关闭/关闭开关(不是随附代码的一部分)允许停止 a2d 并记录显示 O/P
尽管值最初是随机的、但一旦记录足够的值、显示之间的计数值就会明显显示为4或5。
4的空间差异比5大(即687、691、696、680、684)
我是一个失手,没有太多头发可以拉出。
如果有任何建议,将不胜感激。
L.
#include "io430.h" #include "in430.h" #include "intrinsics.h" //库 #include "stdint.h" #include "stdio.h" //固件变量 unsigned int a2d_result = 0; //从 a 到 d 转换的二进制结果 unsigned int cnt_val = 0; // LED_Display ()值 unsigned int delay_val = 5; //延迟例程计数 unsigned int display_val = 0; //发送到单个7段的值显示 unsigned int old_a2d = 0; //保留当前 a2d 值 unsigned int save_num = 0; // LED_Display() 中的持有者变量 unsigned int x = 0; //通用延迟计数器变量 //端口1 -数字 I/O #define DISPLAY_FET_ON P1OUT |= BIT4 // 在#define beep 关闭时显示7段电源 P1OUT &=~BIT6 //关闭系统警报 //端口3数字 I/O #define O_ENABLE_HI P3OUT |= BIT6 // CD74HC4511使能/禁用信号(x3) #define O_ENABLE_LO P3OUT &=~BIT6 #define T_ENABLE_HI P3OUT |= BIT5 #define T_ENABLE_LO P3OUT &=~BIT4 #define H_ENABLE_HI P3OUT |= BIT4 #define H_ENABLE_LO P3OUT &=~BIT4 空延迟(空) //常规延迟 {for (x = delay_val;x > 0;-x) {while (!(TA0CCTL0 & CCIFG)){;} TA0CCTL0 &=~CCIFG; //清除计时器溢出标志 } void A2D_Sample (void) {old_a2d = a2d_result; //主段 ADC10CTL0 &=~ENC 中为比较而保存的之前的 a2d 值; //复位 ADC10XTL0寄存器 ADC10CTL0 = ADC10SHT_2 + ADC10ON; //采样和保持时间16个时钟周期、ADC10 在(ADC10CTL1 & ADC10BUSY)时有效; //等待 ADC10内核已经处于活动 状态 ADC10SA =(无符号整型)&a2d_result; // a2d 值自动从 ADC10MEM ADC10CTL0转移到 a2d_result |= ENC + ADC10SC; //开始采样例程 delay_val = 5; delay(); // a2d 进程稳定延迟 cnt_val =((int)(a2d_result * 0.977)); //将 a2d 值缩放到3位-在 LED_Dispaly() 中使用} 空 Cnt_Send (空) {switch (display_val) {case 0:P1OUT |= 0x00;break; //要发送到 BCD 数据总线 的"0"值大小写1:P1OUT |= 0x01;break; //要发送到 BCD 数据总线 的"1"值大小写2:P1OUT |= 0x02;break; //要发送到 BCD 数据总线 的"2"值大小写3:P1OUT |= 0x03;break; //要发送到 BCD 数据总线 的"3"值大小写4:P1OUT |= 0x04;break; //要发送到 BCD 数据总线 的"4"值大小写5:P1OUT |= 0x05;break; //要发送到 BCD 数据总线 的"5"值大小写6:P1OUT |= 0x06;break; //要发送到 BCD 数据总线 的"6"值大小写7:P1OUT |= 0x07;break; //要发送到 BCD 数据总线 的"7"值大小写8:P1OUT |= 0x08;break; //要发送到 BCD 数据总线 的"8"值 case 9:P1OUT |= 0x09;break; //要发送到 BCD 数据总线 的"9"值} void LED_Display (void) //将 a2d 值分解为单个数字(100s、10s 1) {display_val =(cnt_val / 100); //数百显示值 save_num =(display_val * 100); //保存要在10 `s 计算 P1OUT &= 0xF0中使用的数百个值(整数形式); //重置端口1,位1到位3 - BCD 数据总线 Cnt_Send (); //端口1位0至3数据总线准备例程 H_ENABLE_LO; // 100位 CD74HC4511使能信号 on delay_val = 10; delay(); H_ENABLE_HI; // 100位 CD74HC4511使能信号 off delay_val = 10; delay(); display_val =((((cnt_val -(save_num))/ 10)); //十个显示值 save_num =(save_num)+(display_val * 10); //保存要在10 `s 计算中使用的数百个值(整数形式) P1OUT &= 0xF0; //重置端口1,位1到位3 - BCD 数据总线 Cnt_Send (); //端口1位0至3数据总线准备例程 T_ENABLE_LO; // 10位 CD74HC4511使能信号 on delay_val = 10; delay(); T_ENABLE_HI; // 10位 CD74HC4511使能信号 OFF DELAY_Val = 10; DELAY(); display_val =(cnt_val -(save_num)); //一个显示值 P1OUT &= 0xF0; //重置端口1,位1到位3 - BCD 数据总线 Cnt_Send (); //端口1位0至3数据总线准备例程 O_ENABLE_LO; delay_val = 10时// 1位 CD74HC4511使能信号; delay (); O_ENABLE_HI; // 1的数字 CD74HC4511使能信号 OFF DELAY_Val = 10; delay (); P1OUT &= 0xF0; //确保所有 CD74HC4511使能信号都关闭 cnt_val = 0; //将 cnt_val 重置为0000 (用于确保每次通过的 cnt_val 中有新值的调试工具) } #pragma vector=TIMER0_A0_vector // timer_A 中断 __interrupt void Timer0_A0 (void) {} void main (void) {WDTCTL = WDTPW + WDTHOLD; //停止看门狗定时器 BCSCTL1 = XT2OFF; //振荡2关闭 P1DIR = 0xFF; //端口1:所有输出 P1SEL = 0x00; //端口1:数字 I/O P1REN = 0x00; //端口1:P1OUT = 0x20上拉电阻; //端口1:除 P1.5 LED 关闭(1)、P1.6蜂鸣器关闭(0)之外的所有低电平状态输出 P3DIR = 0xFF; //端口3:所有输出 P3SEL = 0x00; //端口3:所有数字 I/O P3REN = 0x00; //端口3:P3OUT = 0xFF 上拉电阻器; //端口3:引脚1-6 hi (bcd 至7 seg 芯片使能关)(1111 1111) __ENABLE_INTERRUPT ();//启用所有中断 // TA0 - ALARM & DELAY ()定时器 TA0CCR0 |= 990; //材料计数器和延迟计时器 TA0CCTL0 |= CCIE; //在计数溢出时启用 TA0CCR0中断标志 TA0CTL = tassel_2 + MC_1 + ID_0 + TACLR; // smclk 源,向上计数模式,/1,清除计数器 ADC10CTL0 = SREF_0 + ADC10SHT_2 + ADC10ON; //*16、ADC10寄存器有效 ADC10CTL1 = INCH_4 + ADC10DIV_0 + ADC10SSEL_0 + CONSEQ_0; // A4、ADC10SC 位、 ADC10AE0 |= 0x04; //使能控制寄存器-模拟输入 A4使能 ADC10DTC1 = 0x001; //启用数据传输控制寄存器、1块传输 DISPLAY_FET_ON; //翻转7段显示电源 delay_val = 5; // 7段显示稳定延迟 (); LED_Display (); //初始速度显示-需要点亮显示 while (1) {A2D_Sample (); // a2d 样本 如果(((a2d_result + 3)< old_a2d)||((a2d_result - 3)> old_a2d) // a2d 值变化> 3计数 LED_Display(); } }