📄 init.c
字号:
// init.c
//
#include <io8515v.h>
#include <macros.h>
#include "1602LCD.h"
#include "PID.h"
#include "main.h"
// ADC寄存器
#define ADCCR (*(volatile unsigned char *) 0x4000) // ADC控制器
#define ADCH (*(volatile unsigned char *) 0x4001) // 高4位寄存器
#define ADCL (*(volatile unsigned char *) 0x4000) // 低8位寄存器
// DAC寄存器
#define DAC1 (*(volatile unsigned char *) 0x8000) // 通道1
#define DAC2 (*(volatile unsigned char *) 0x8001) // 通道2
#define DAC3 (*(volatile unsigned char *) 0x8002) // 通道3
#define DAC4 (*(volatile unsigned char *) 0x8003) // 通道4
#define DACEN (*(volatile unsigned char *) 0xc000) // 转换开始
//#define K0 32.76 // DAC转换系数
//#define K1 2.01 // ADC转换系数
// 端口初始化
void port_init(void)
{
PORTA = 0xFF;
DDRA = 0x00;
PORTB = 0xFF;
DDRB = 0xFF;
PORTC = 0xFF;
DDRC = 0x00;
PORTD = 0xFF;
DDRD = 0x04;
}
// TIMER0初始化
void timer0_init(void)
{
TCCR0 = 0x00; //stop timer
TCNT0 = 0xD9; //set count value
TCCR0 = 0x05; //start timer
}
// TIMER1初始化
void timer1_init(void)
{
TCCR1A = 0x00;
TCCR1B = 0x00; //stop
OCR1AH = 0x07;
OCR1AL = 0xD0;
OCR1BH = 0x07;
OCR1BL = 0xD0;
TCNT1H = 0xF8; //setup
TCNT1L = 0x30;
TCCR1B = 0x02; //start Timer
}
// 数据格式转换
void data_init(unsigned int data)
{
int i;
for(i=4;i>=0;i--)
{
value_table[i]=data%10;
data/=10;
}
}
// 初始化
void init_devices(void)
{
CLI();
port_init();
timer0_init();
timer1_init();
LCD_init();
MCUCR = 0xC2; // 外部SRAM访问
GIMSK = 0x40; // INT0中断
TIMSK = 0x82; // T/C0、T/C1中断
ADCCR=0x60; // 开启ADC
ADCCR=0x40;
DAC1=0; // 开启DAC通道1
DAC2=0; // 开启DAC通道2
DAC3=0; // 开启DAC通道3
DAC4=DAC4_value; // 开启DAC通道4
DACEN=0;
LCD_write_string(0,0,"O:0020 R:0000 mA");
LCD_write_string(0,1," ^ +/-ing...");
value=20;
ADC_GD=20*K1;
DAC=7882;
SEI();
}
// 读取ADC转换值 启动AD在PID运算后
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
unsigned int ii;
unsigned int jj;
//external interupt on INT0
ii=ADCL;
delay_nus(1);
jj=ADCH;
ADC=jj;
ADC<<=8;
ADC|=ii;
arv_ADC+=(unsigned long)ADC;
arv_count++;
}
// 1s显示一次数据
#pragma interrupt_handler timer0_ovf_isr:8
void timer0_ovf_isr(void)
{
SEI();
TCNT0 = 0xD9; //reload counter value
time_count++;
if(time_count==100)
{
time_count=0;
LCD_display(9,0,4,arv_ADC/arv_count/K1);
arv_ADC=0;
arv_count=0;
}
}
// 0.01s采集并发送控制数值
#pragma interrupt_handler timer1_ovf_isr:7
void timer1_ovf_isr(void)
{
long iii;
unsigned int ii;
float jj;
TCNT1H=Time1>>8;
TCNT1L=Time1&0xff;
// PID函数
PID(ADC-ADC_GD);
DAC3=DAC>>8; // 写DAC3寄存器
DAC2=DAC&0x0FF; // 写DAC4寄存器
DACEN=0; // 开始DA转换
ADCCR=0x60; // 启动ADC
ADCCR=0x40;
PORTB^=0x01;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -