このQ&Aは役に立ちましたか?
PIC12F675、HC-SR04のプログラム
2023/10/20 08:22
- PIC12F675にプログラムを書き込み、HC-SR04の距離が5cm以下の時にブザーが鳴るようにしたいです。
- 現在のプログラムでは、距離に関わらず出力が一定になっています。
- プログラムに間違いがあれば教えていただけませんか。
PIC12F675、HC-SR04のプログラム
2020/03/17 12:00
PIC12F675にプログラムをMPLABX IPEで書き込んで、超音波センサ HC-SR04の距離が5cm以下の時にブザーが鳴る(出力が5Vになる)ようにしたいです。
以下のプログラムで出力は、距離に関わらず5Vか0Vで一定になっています。
プログラムに間違いがあれば、教えていただけないでしょうか。
#include <xc.h>
#include <stdio.h> //12F675
#include <stdlib.h>
#pragma config FOSC = INTRCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-Up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = OFF // Brown-out Detect Enable bit (BOD disabled)
#pragma config CP = OFF // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#define _XTAL_FREQ 32000000
#define TX_UART_SIZE 3
#define SONIC_TRIG GPIO5
#define SONIC_ECHO GPIO4
#define SONIC_TEMP GPIO2
#define SONIC_BUZZ GPIO1
#define IO_OFF 0
#define IO_ON 1
#define TIME_OFF -1
#define TIME_UP 0
#define TIME_START_H 0xD8
#define TIME_START_L 0xF0
#define TIME_LED_CNT_MAX 5
#define TIME_LED_CNT2_MAX 15
unsigned char cnt10ms;
char TimerLed1;
char TimerLed2;
int main(int argc, char** argv)
{
long echo_time;
long dist;
OSCCAL = 0b00110000 ; // 内部クロック8MHz
ANSEL = 0x00 ; // AN未使用、デジタルI/Oに割当てる
CMCON = 0x07; // コンパレータ未使用
TRISIO = 0b00011100 ; // RA2,3,4を入力にし、他は出力に割当てる
GPIO = 0b00000000 ; // 出力ピンの初期化(全てLOWにする)
T1CON = 0b01110000 ; // ゲート有効、Hiでカウント、単一パルス、T1Gピン
TMR1ON = 1; // タイマー1開始
while(1)
{
// タイマ1のカウンタ準備
TMR1 = 0; // カウンタの初期化TMR1 = 0;
// トリガ送信
SONIC_TRIG = IO_ON;
__delay_us( 10 );
SONIC_TRIG = IO_OFF;
// エコー信号のON待ち
while( SONIC_ECHO == IO_OFF )
{
}
// エコー信号のOFF待ち
while( SONIC_ECHO == IO_ON )
{
}
// 超音波の往復時間を取得
echo_time = TMR1;
// 往復時間から片道の時間にする
echo_time /= 2;
// パルス時間から距離(cm)に変更
dist = echo_time * 34 / 1000;
if( dist <= 5 ) //距離5cm以下でブザー出力
{
(SONIC_BUZZ = 1);
}
else
{
(SONIC_BUZZ = 0);
}
__delay_ms( 1000 );
}
return (EXIT_SUCCESS);
}
回答 (2件中 1~2件目)
PICに接続される外部回路が分からないので、
内部のみに関して見れば、クロックに関する
設定などが何か所か間違っていると思います。
・PIC12F675の内部クロックは4MHz固定で
ないのか。
・それなのに距離計算は32MHzクロック想定
のままでよいのか。
etc....
このQ&Aは役に立ちましたか?
この質問は投稿から一年以上経過しています。
解決しない場合、新しい質問の投稿をおすすめします。