2

このチュートリアルに従い、マイクロコントローラー 16f1827 のコードを変更しました。コードの機能も変更しました。ADC 値が最大値の半分を超える場合、LED をオンにする必要があります。ADC 値の半分以下の場合は LED をオフにします。

// CONFIG
#pragma config FOSC = HS      // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF     // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF    // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF    // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF      // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF      // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF      // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF       // Flash Program Memory Code Protection bit (Code protection off)

#include <xc.h>
#include <pic16f1827.h>

#define _XTAL_FREQ 8000000

void ADC_Init()
{
  ADCON0 = 0x81;               //Turn ON ADC and Clock Selection
  ADCON1 = 0x00;               //All pins as Analog Input and setting Reference Voltages
}

unsigned int ADC_Read(unsigned char channel)
{
  if(channel > 7)              //Channel range is 0 ~ 7
    return 0;

  ADCON0 &= 0xC5;              //Clearing channel selection bits
  ADCON0 |= channel<<3;        //Setting channel selection bits
  __delay_ms(2);               //Acquisition time to charge hold capacitor
  GO_nDONE = 1;                //Initializes A/D conversion
  while(GO_nDONE);             //Waiting for conversion to complete
  return ((ADRESH<<8)+ADRESL); //Return result
}

void main()
{
  unsigned int a;
  TRISA = 0xFF;                 //Analog pins as Input
  TRISB = 0x00;                 //Port B as Output
  //TRISC = 0x00;                 //Port C as Output
  ADC_Init();                   //Initialize ADC

  do
  {
    a = ADC_Read(0);            //Read Analog Channel 0
    //PORTB = a;                  //Write Lower bits to PORTB
    //PORTC = a>>8;               //Write Higher 2 bits to PORTC


if(a > 512){
PORTBbits.RB7 = 1;
}else{
PORTBbits.RB7 = 0;
}


    __delay_ms(100);            //Delay
  }while(1);                    //Infinite Loop
}

コードは XC8 でエラーなしでコンパイルされます。問題は、PIC が検出する ADC の変化が遅すぎることです。入力ピンを正の基準値に接続すると、おそらく 2 秒の遅延で LED がオンになります。ADC 入力を 0v に変更すると、同じことが起こります。すべての変更は非常に遅く検出されます。ADC の動作が遅いのはなぜですか?

4

1 に答える 1

3

リンク先のチュートリアルでは、PIC16F877A を 8MHz の水晶発振器で使用していますが、PIC16F1827 を外部発振器ではなく内部発振器で使用しようとしているようです。行ったように PIC ヘッダー ファイルを変更するだけでは十分ではありません。また、必要なオシレータ モードを設定し、2 つの部分で異なるその他の構成オプションに注意する必要があります。確かではありませんが、16F1827 のデフォルトの内部発振器周波数は 8MHz ではなく 1MHz だと思います。これは、あなたが経験している問題を説明するのにある程度役立つかもしれません。

ところで: コードをごまかそうとしないでください。マイクロコントローラーを正しく構成していることを確認してください。

于 2016-09-02T16:05:38.023 に答える