RISC_V循迹小车程序
C程序
因为用的时perfv已经集成好的IDE,里面H文件已经包含好了,所以只有C。
位置在E:\project\car_1\car_1\src
/**************************************************************
** 本程序展示了蜂鸟的PWM功能,蜂鸟中定义了PWM0、PWM1、PWM2三个PWM控制寄存器,每个PWMx可以输出
** 4路PWM波,所以最多可以提供12路PWM波输出。本程序用到了PWM1的4路PWM波输出
**
** 引脚硬件连接
** PWM输出,本程序用到了D3和D4输出
** PWM1_0用PWM_CMP0控制占空比,对应D4引脚(20)
** PWM1_1用PWM_CMP1控制占空比,对应D3_SCL引脚(19)
** PWM1_2用PWM_CMP2控制占空比,对应D5引脚(21)
** PWM1_3用PWM_CMP3控制占空比,对应D6引脚(22)
**
** 红外信号(left) ------------> D0
** 红外信号(right) ------------> D1
**
** 电机驱动模块 开发板
** IN1 ------------> D8
** IN2 ------------> D9
** IN3 ------------> D10
** IN4 ------------> D11
** ENA ------------> D3_SCL
** ENB ------------> D4
**
**舵机信号线 ------------> D5
**
**超声波收发模块 开发板
**引脚 Trig ------------> A0
**引脚 Echo ------------> A1
**引脚 Vcc ------------> 5V VCC
**引脚 Gnd ------------> GND
**************************************************************/
/**********************************************************************
***********************************************************************/
//========================== smart-car-gpio===========================//
#define run 1
#define stop 0
#define left_monitor D0_RX1
#define right_monitor D1_TX1
#define car_motor_IN1 D8
#define car_motor_IN2 D9
#define car_motor_IN3 D10
#define car_motor_IN4 D11
#define car_motor_ENA D3_SCL
#define car_motor_ENB D4
#define servo_motor D5//控制舵机 输出PWM的引脚
//2018-8-7
#define servo_motor_right PWM1_REG(PWM_CMP2) = 0xffff/1000*125; // PWM高电平为0.5ms 舵机为0度
#define servo_motor_middle PWM1_REG(PWM_CMP2) = 0xffff/1000*125*3;// PWM高电平为1.5ms 舵机为90度
#define servo_motor_left PWM1_REG(PWM_CMP2) = 0xffff/1000*125*5;// PWM高电平为2.5ms 舵机为180度
//2018-8-8
#define left_monitor_run_fast PWM1_REG(PWM_CMP1) = 0xffff/9*4 // 4/9 PWM
#define right_monitor_run_fast PWM1_REG(PWM_CMP0) = 0xffff/9*4 // 4/9 PWM
#define left_monitor_run PWM1_REG(PWM_CMP1) = 0xffff/9*3 // 2/9 PWM
#define right_monitor_run PWM1_REG(PWM_CMP0) = 0xcccc/9*3 // 2/9 PWM
#define left_monitor_stop PWM1_REG(PWM_CMP1) = 0
#define right_monitor_stop PWM1_REG(PWM_CMP0) = 0
//===================================================================//
#include <stdio.h>
#include <stdlib.h>
#include "platform.h"
#include <string.h>
#include "plic/plic_driver.h"
#include "encoding.h"
#include <unistd.h>
#include "stdatomic.h"
void reset_demo (void);
uint32_t GPIO_SET(uint32_t pin_num,uint32_t pin_val,uint32_t pin_model);
void smartcar_init(void);
void tracking_car_control(void);
uint32_t read_pin_val(uint32_t pin_num);
int delay_us(uint32_t time_x);
void PWM_init();
volatile void wait_ms(uint64_t ms);
float ultrasonic(void);
void ultrasonic_control();
void motor_right();
void motor_left();
void motor_run();
void motor_stop();
void motor_back();
void motor_forward();
volatile int ultrasonic_run = 1;//超声波检测标志
//=================================================================
// Structures for registering different interrupt handlers
// for different parts of the application.
typedef void (*function_ptr_t) (void);
void no_interrupt_handler (void) {
};
function_ptr_t g_ext_interrupt_handlers[PLIC_NUM_INTERRUPTS];
// Instance data for the PLIC.
plic_instance_t g_plic;
//******************************************************************
//函数名: wait_ms()
//作者: Alvin Xu of PerfXLab
//日期: 2018-08-01
//功能: 调用一次产生ms毫秒的软件延时
//输入参数:ms :毫秒数
//返回值: 无
//修改记录:无
//******************************************************************
volatile void wait_ms(uint64_t ms)//busy wait for the specified time
{
static const uint64_t ms_tick = RTC_FREQ/1000;
volatile uint64_t * mtime = (uint64_t*) (CLINT_CTRL_ADDR + CLINT_MTIME);
uint64_t then = (ms_tick * ms) + *mtime;
while(*mtime<then);
}
//******************************************************************
//函数名: reset_demo
//作者: PerfXLab
//日期: 2018-07-04
//功能: 定时器初始化程序
//输入参数:无
//返回值: 无
//修改记录:无
//******************************************************************
void reset_demo ()
{
// Disable the machine & timer interrupts until setup is done.
clear_csr(mie, MIP_MEIP);
clear_csr(mie, MIP_MTIP);
for (int ii