附录:
电炉控制原理图
1.测温电路PCB
2.电炉控制电路PCB
18
程序清单
1.AD采样和转化
AD初始化
/********************************************************************** Function name: ADCInit
** Descriptions: P2.0触发ADC转换初始化 ** input parameters: 无 ** output parameters: 无 ** Returned value: 无
*******************************************************************/ void ADCInit()
{ SYSAHBCLKCTRL |= (0x01 << 16); /*配置PIO0_11为模拟输入模式*/ PDRUNCFG &= ~(0x01 << 4); /* ADC模块上电*/
SYSAHBCLKCTRL |= (0x01 << 13); /* 使能ADC模块时钟*/
IOCON_PIO0_11 &= ~0xBF; /* 设置PIO0_11为模拟输入模式 */ IOCON_PIO0_11 |= 0x02; /* PIO0_110模拟和输入通道零*/ AD0CR = ( 0x01 << 0 ) | /* SEL=1,选择ADC0*/
(( FAHBCLK / 1000000 - 1 ) << 8 ) | /* 转换时钟1MHz*/ ( 1 << 16 ) | /* BURST=1,使用Burst模式 */ ( 0 << 17 ) | /* 使用11 clocks转换 */ ( 0 << 24 ) | /* 当P0.2出现bit27所选的 */ /* 延时产生中断 */ ( 0 << 27 ); /* 直接启动ADC,此位无效 */ }
2.显示和按键实现
显示和按键为一整体,采用SPI控制 void SPI_INIT(void) {
PRESETCTRL |= 0x01; /* 禁止SPI0复位 */
//IOCON_SCKLOC = 0x1002 /*如果在头文件中改成了SPI功能就不需要设置*/ SYSAHBCLKCTRL |= 1<<11; /* 打开SPI0外设 */ SSP0CLKDIV = 0x01; /* SSP时钟分频 */
SSP0CR0 = (0X01 << 8)| /* SCR 设置SPI时钟分频 */ (0x01 << 7)| * CPHA 时钟输出相位, */ /* 仅SPI模式有效 */ (0x01 << 6)| /* CPOL 时钟输出极性, */ /* 仅SPI模式有效 */ (0X00 << 4)| /* FRF 帧格式 00=SPI,01=SSI, */ /* 10=Microwire,11=保留 */ (0x07 << 0); /* DSS 数据长度,0000-0010=保留*/ /* 0011=4位,0111=8位,1111=16位 */
19
SSP0CR1 = (0x00 << 3)| /* SOD 从机输出禁能,1=禁止 */ (0x00 << 2)| /* MS 主从选择,0=主机,1=从机 */ (0x01 << 1)| /* SSE SSP使能 */ (0x00 << 0); * LBM 回写模式 */ SSP0CPSR = 2; /* PCLK分频值 */ SSP0ICR = 0x03; /* 中断清除寄存器 */ }
uint8 SPISendData(uint8 data) { SSP0DR = data;
while ((SSP0SR & 0x01) == 0)
{ /* ; }
return(SSP0DR);}
void BCD_iDATA(int x,int y,int z) {
iDATA[7] =x/100; iDATA[6] =x0/10; iDATA[5] =x; iDATA[4] =y;
iDATA[3] =(z/100); iDATA[2] =(z/10); iDATA[1] =(z); iDATA[0] =z*100;
}
uint8 KEY_Get(uint8 key_data) {
static uint8 key_down = 0; static uint16 dly_time = 0; uint8 key_reust = 12; if( 0 == KEY_DATA()&& 0 == key_down) {
key_down = 1; } else {
if(1 == key_down) {
dly_time++;
if(dly_time >= delaytime) {
dly_time = 0; key_down = 0;
key_reust = key_data;
20
等待TFE置位,即发送FIFO空 */
}
} } }
return key_reust;
3.PID实现
/**************************************************************************
** 函数名称: CalPID
** 函数描述: 根据偏差值调节PWM占空比 ** 输入参数: 第一次的偏差值 ** 输出参数: 无 ** 返回值 : PWM
**************************************************************************/
int CalPID(int ek) {
static int ek1 = 0,ek2 = 0; static int PWM = 0;
PWM = PWM + Kp*(ek - ek1)+ Ki*ek + Kd*(ek - 2*ek1 + ek2); if (PWM >= 100) {
PWM = 100; }
if (PWM <= 0) {
PWM = 0; }
ek2 = ek1; ek1 = ek; return PWM; }
4.串口实现
通过程序,实现PC机和系统的通信,其初始化程序如下。
/**************************************************************************
** 函数名称:UART0_Init
** 函数功能:初始化串口0。设置为8位数据位,1位停止位,无奇偶校验,波特率为115200
** 入口参数:无 ** 出口参数:无
**************************************************************************/
void UART0_Init(void)
21
{
INT16U usFdiv;
SYSAHBCLKCTRL |= (1<<12); /* 打开UART功能部件时钟 */
UARTCLKDIV = 0x01; /* UART时钟分频 */
U0LCR = 0x83; /* 允许设置波特率 */
usFdiv = (FAHBCLK/UARTCLKDIV/16)/UART_BPS; /* 设置波特率 */
U0DLM = usFdiv / 256; U0DLL = usFdiv % 256;
U0LCR = 0x03; /* 锁定波特率 */ U0FCR = 0x87; /* 使能FIFO,设置8个字节触发点 */ U0IER = 0x01; }
5.主函数
/**************************************************************************
** Function name: main ** Descriptions: ** input parameters: 无 ** output parameters: 无 ** Returned value: 无
**************************************************************************/
int main (void) {
targetInit(); // 初始化目标板,切勿删除 pinInit(); // 引脚初始化
SYSAHBCLKCTRL |= (1ul << 6); // 使能GPIO模块时钟
TinyHMIInit(); //数码管驱动初始化 ADCInit(); //模数转换初始化 SysTickInit(); //系统时钟初始化 UART0_Init(); //串口初始化
Temp_PID_Init();//温度PID调节初始化 //print(ShowBuf); //数码管显示初始化 SetPwmOut(0);
22
//BEEP_INIT();
while (1) 话 } }
{
Data_dis_play(Get_ADCData()); //数码管显示,不用数码管显示可以去掉这句
23