//C30 V3.2 最高优化级别会出问题, param_tab[param_index_tab[param_num]] = param_buf; /* //2010-01-16 10号参数改成0.17秒, 11改成 0.24秒, 22改成8.00Hz int __builtin_divsd(const long num, const int den); unsigned __builtin_divud(const unsigned long num,const unsigned den); long __builtin_mulss(const int p0, const int p1); long __builtin_mulsu(const int p0, const unsigned p1); long __builtin_mulus(const unsigned p0, const int p1); unsigned long __builtin_muluu(const unsigned p0,const unsigned p1); unsigned __builtin_tblpage(const void *p); unsigned __builtin_tbloffset(const void *p); unsigned __builtin_psvpage(const void *p); unsigned __builtin_psvoffset(const void *p); */ #include "p30Fxxxx.h" #include "libpic30.h" #include "string.h" typedef unsigned char uchar; typedef unsigned short uint; typedef short int sint; typedef unsigned long ulong; #define UNIT_10MS //加减速时间单位设成10MS, 原先是100MS //#define DEBUG _FOSC(HS2_PLL16 & CSW_FSCM_OFF); _FWDT(WDT_ON); //_FBORPOR(MCLR_EN & PWRT_OFF); //Enable MCLR reset pin and turn off the //power-up timers. _FBORPOR(PBOR_ON & BORV_45 & PWRT_64 & MCLR_EN); _FGS(CODE_PROT_ON & GWRP_ON); #define FCY 20000000 // xtal = 10Mhz; 10MHz /2 *PLLx16 -> 20 MIPS #define FPWM 15625 // 15.625 kHz, so that no audible noise is present. #define BYTE_DATA(x) x,x/256 #define RAM_B9 LED_BUF[0] //BIT5:0---->正在减速,1--->直流制动 //BIT0:指示灯 #define RAM_BA LED_BUF[1] //对应最右边数码管 #define RAM_BB LED_BUF[2] #define RAM_BC LED_BUF[3] #define RAM_BD LED_BUF[4] #define RAM_BE LED_BUF[5] //对应最左边数码管 #define RAM_0128 param_tab[0] //00 主频率输入设定 0 8 //从RAM_0128 ---- RAM_0199 对应93C的内容 #define RAM_0129 param_tab[1] //01 运转指令来源设定 2 4 #define RAM_012A param_tab[2] //02 电机停机方式设定 0 3 #define RAM_012B param_tab[3] //15 S-曲线加速选择 0 7 #define RAM_012C param_tab[4] //24 反转禁止功能 0 1 #define RAM_012D param_tab[5] //25 过电压失速防止功能 1 1 #define RAM_012E param_tab[6] //26 过电流失速防止-->加速中 170% 200% #define RAM_012F param_tab[7] //27 过电流失速防止-->运转中 170% 200% #define RAM_0130 param_tab[8] //28 直流制动-->直流制动电压准位 25 50 #define RAM_0131 param_tab[9] //29 直流制动-->启动时直流制动时间 0 50 #define RAM_0132 param_tab[10] //30 直流制动-->停止时直流制动时间 5 250 #define RAM_0133 param_tab[11] //32 瞬时停电再启动-->运转方式 0 2 #define RAM_0134 param_tab[12] //33 瞬时停电再启动-->停电之****时间 20 50 #define RAM_0135 param_tab[13] //34 瞬时停电再启动-->复电后追踪时间 5 50 #define RAM_0136 param_tab[14] //35 瞬时停电再启动-->速度追踪之****电流 150% 200% #define RAM_0137 param_tab[15] //38 外部运行指令-->二线/三线运转控制 0 3 #define RAM_0138 param_tab[16] //39 多功能输入端子-->端子一 0 23 #define RAM_0139 param_tab[17] //40 多功能输入端子-->端子二 1 23 #define RAM_013A param_tab[18] //41 多功能输入端子-->端子三 2 23 #define RAM_013B param_tab[19] //50 模拟输出频率/电流-->模拟信号输出 0 1 #define RAM_013C param_tab[20] //44 类比输出增益 100% 200% #define RAM_013D param_tab[21] //45 多功能输出端子功能选择 0 9 #define RAM_013E param_tab[22] //46 保留 1 9 #define RAM_013F param_tab[23] //48 模拟输入/频率曲线-->最高频率模拟量 100 100 #define RAM_0140 param_tab[24] //49 模拟输入/频率曲线-->最低频率模拟量 3 100 #define RAM_0141 param_tab[25] //70 跳跃频率--->跳跃频率宽度 0 200 #define RAM_0142 param_tab[26] //52 电机运转资料-->电机额定电流 100% 120% #define RAM_0143 param_tab[27] //53 电机运转资料-->电机空载电流 40% 99% #define RAM_0144 param_tab[28] //54 自动转矩补偿增益 0 100 #define RAM_0145 param_tab[29] //55 自动转差补偿增益 0 100 #define RAM_0146 param_tab[30] //57 多功能输出接点 0 6 #define RAM_0147 param_tab[31] //51 AVR自动稳压功能设定 1 1 #define RAM_0148 param_tab[32] //60 过转矩检出功能 0 4 #define RAM_0149 param_tab[33] //61 过转矩检出准位 150% 200% #define RAM_014A param_tab[34] //62 过转矩检出时间 13 100 #define RAM_014B param_tab[35] //64 功能显示项目--->显示项目 0 12 #define RAM_014C param_tab[36] //42 多功能输入端子-->端子四 5 23 #define RAM_014D param_tab[37] //71 PWM频率 2 5 #define RAM_014E param_tab[38] //72 故障后,自动重置/启动次数 0 10 #define RAM_014F param_tab[39] //73 故障-->最近第一次故障代号 7 13 #define RAM_0150 param_tab[40] //74 故障-->最近第二次故障代号 1 13 #define RAM_0151 param_tab[41] //75 故障-->最近第三次故障代号 1 13 #define RAM_0152 param_tab[42] //76 参数锁定/初始化 0 10 #define RAM_0153 param_tab[43] //77 通信速率 2 2 #define RAM_0154 param_tab[44] //78 通信地址 0 31 #define RAM_0155 param_tab[45] //43 保留 2 20 #define RAM_0156 (((uint *)¶m_tab[46])[0]) //03 V/F曲线-->最高操作频率 6000 40000 #define RAM_0158 (((uint *)¶m_tab[48])[0]) //04 V/F曲线-->基频 5000 40000 #define RAM_015A (((uint *)¶m_tab[50])[0]) //05 V/F曲线-->基压 360 5100 #define RAM_015C (((uint *)¶m_tab[52])[0]) //06 V/F曲线-->中间频率 150 40000 #define RAM_015E (((uint *)¶m_tab[54])[0]) //07 V/F曲线-->中间电压 200 5100 #define RAM_0160 (((uint *)¶m_tab[56])[0]) //08 V/F曲线-->最低输出频率 150 2000 #define RAM_0162 (((uint *)¶m_tab[58])[0]) //09 V/F曲线-->启动电压 200 1000 #define RAM_0164 (((uint *)¶m_tab[60])[0]) //10 加减速时间-->第一加速时间 2 9999 #define RAM_0166 (((uint *)¶m_tab[62])[0]) //11 加减速时间-->第一减速时间 2 9999 #define RAM_0168 (((uint *)¶m_tab[64])[0]) //12 加减速时间-->第二加速时间 2 9999 #define RAM_016A (((uint *)¶m_tab[66])[0]) //13 加减速时间-->第二减速时间 4 9999 #define RAM_016C (((uint *)¶m_tab[68])[0]) //14 点动加减速时间 100 9999 #define RAM_016E (((uint *)¶m_tab[70])[0]) //16 多段速-->第一段频率选择 4500 40000 #define RAM_0170 (((uint *)¶m_tab[72])[0]) //17 多段速-->第二段频率选择 4000 40000 #define RAM_0172 (((uint *)¶m_tab[74])[0]) //18 多段速-->第三段频率选择 3500 40000 #define RAM_0174 (((uint *)¶m_tab[76])[0]) //19 多段速-->第四段频率选择 3000 40000 #define RAM_0176 (((uint *)¶m_tab[78])[0]) //20 多段速-->第五段频率选择 2500 40000 #define RAM_0178 (((uint *)¶m_tab[80])[0]) //21 多段速-->第六段频率选择 2000 40000 #define RAM_017A (((uint *)¶m_tab[82])[0]) //22 多段速-->第七段频率选择 1500 40000 #define RAM_017C (((uint *)¶m_tab[84])[0]) //23 点动频率先择 500 40000 #define RAM_017E (((uint *)¶m_tab[86])[0]) //31 停止时直流制动起始频率 0 6000 #define RAM_0180 (((uint *)¶m_tab[88])[0]) //36 输出频率上限 20000 40000 #define RAM_0182 (((uint *)¶m_tab[90])[0]) //37 输出频率下限 0 40000 #define RAM_0184 (((uint *)¶m_tab[92])[0]) //47 任意达到频率 0 40000 #define RAM_0186 (((uint *)¶m_tab[94])[0]) //56 保留 0 0 #define RAM_0188 (((uint *)¶m_tab[96])[0]) //59 保留 60 300 #define RAM_018A (((uint *)¶m_tab[98])[0]) //63 保留 5 9999 #define RAM_018C (((uint *)¶m_tab[100])[0]) //65 比例常数 60 2000 #define RAM_018E (((uint *)¶m_tab[102])[0]) //66 计数值到达功能设定 10 9999 #define RAM_0190 param_tab[104] //FFH 40000 用于计算输入压比例 #define RAM_0191 param_tab[105] //FFH #define RAM_0192 (((uint *)¶m_tab[106])[0]) //68 跳跃频率--->跳跃频率一 0 40000 #define RAM_0194 (((uint *)¶m_tab[108])[0]) //69 跳跃频率--->跳跃频率二 0 40000 #define RAM_0196 (((uint *)¶m_tab[110])[0]) //80 本机规格 0 9999 #define RAM_0198 (((uint *)¶m_tab[112])[0]) //58,79 用户自定义频率 5000 40000 -->67 用户自定义频显示(只读) #define DAT_165 _RB8 #define SRCLK _RC13 #define RCLK _RC14 #define COUNTER_PIN _RD0 #define SER _RD1 #define OUTPUT1 _RF4 #define OUTPUT2 _RD3 #define FAN _RF5 #define PWM _RD2 //OC3 #define V18_ERROR _RF1 #define FULL_POWER _RF0 #define ERROR_TURN_OFF _RF6 #define UART_LED _RB7 #include "const.c" uchar param_tab[116]; uint RAM_30; uint RAM_32; uint RAM_38; //PWM输出相, 共分为6相 //uint RAM_3A; //PWM载波周期对应的计数值 //uint RAM_3C; uint RAM_3E; long RAM_40; //1相内,正弦值索引 //#define RAM_42 (((uint *)&RAM_40)[1]) ulong RAM_44; //正弦步进 uint RAM_48; uint RAM_4A; uint RAM_4C; //输出电压幅度,****为WG_COUNTER值 ulong RAM_50; #define RAM_52 (((uint *)&RAM_50)[1]) uint RAM_54; //当前频率 uint RAM_56; //目标-->工作频率 uint param_buf; uint RAM_62; //自定义工作频率 uint RAM_66; //负载,过流计时 //uint RAM_68; uint RAM_6A; //计时单元,2.5MS加1 uint RAM_6C; //定时 uint RAM_6E; //定时 //uint RAM_70; //PWM频率索引值 uint RAM_72; ulong RAM_74; //当前运行频率 #define RAM_76 (((uint *)&RAM_74)[1]) uint RAM_78; //内部计数,从RAM_018E 倒计时到 RAM_018A uint RAM_7A; //过转矩计时,单位2.5MS uchar RAM_7C; uchar RAM_7D; uint RAM_7E; uint RAM_80; //采样滤波,电流百分比 #define RAM_81 (((uchar *)&RAM_80)[1]) uint RAM_82; //用于稳压输出 uint RAM_84; //;05 V/F曲线-->基压 uint RAM_86; //= 07 V/F曲线-->中间电压 uint RAM_88; //09 V/F曲线-->启动电压 uint RAM_8A; //选择频率索引 = RAM_9B/2 uint RAM_8C; uint RAM_8E; //固定值:112 uint RAM_90; uint RAM_92; //= 电机额定电流 - 电机空载电流 uint RAM_94; uint RAM_96; //RS-485 输入的频率 uint RAM_98; uchar RAM_9B; //选择频率索引 uchar RAM_9C; uchar RAM_9D; uchar setup_num; //设置状态,第几步: //1--->频率指令 //4--->选择参数编号 //5--->调整参数 uchar RAM_9F; //标志: BIT0: 有错误发生 uchar RAM_A0; //用于连续按键延时 uchar RAM_A1; //用于连续按键延时,随着按键时间越长,按键速率越快 uchar RAM_A2; //BIT2: 0--->参数索引号个位,1--->十位 //BIT3: 内部计数到达 uchar RAM_A3; uchar RAM_A4; uchar RAM_A5; //用于数码管闪烁计时 uchar RAM_A6; //BIT0: 用于按键扫描 //BIT3: 1--->禁止按键操作 uchar RAM_A7; //BIT4,5,6表示:调参数哪一位 uchar RAM_A8; uchar RAM_A9; uchar RAM_AA; //BIT0--->按键标志 //BIT3--->端子故障 //BIT7--->选择点动加减速时间 uchar INPUT_BUF; //读到P3口控制端内容 uchar RAM_AC; //用于检测外部引脚 uchar RAM_AD; //等P5口, 可能用于多功能输出端子 char param_num; //参数索引 uchar RAM_AF; uchar RAM_B0; //EEPROM 地址 uchar RAM_B1; uchar RAM_B2; //读EEPROM还回值 uchar RAM_B3; uchar RAM_B4; uchar RAM_B5; //BIT0:1-->RUN 指令,0--->STOP指令 //BIT1:1-->反转,0--->正转 uchar RAM_B6; //BIT0--->运转中 //BIT1--->0:正转 uchar error_num; //故障代号 uchar RAM_B8; //LED 位选, B9-BE 每位的段内容 uchar LED_BUF[6]; uchar RAM_BF; //上一次按键号 uchar key_buf; //键值 uchar RAM_C1; //读控制端口的延时 uchar RAM_C2; //用于串口 uchar RAM_C3; //串口发送计数 uchar RAM_C4; //BIT0-->1:接收完成标志 uchar RAM_C5; //BIT0-->1:发送完成标志 uchar RAM_C6; //BIT0-->1:过转矩 uchar RAM_C7; //RS-485通信BUFFER,从RAM_D1为第一字节,RAM_C7为最后 uchar RAM_C8; uchar RAM_C9; uchar RAM_CA; uchar RAM_CB; uchar RAM_CC; uchar RAM_CD; //地址码 uchar RAM_CE; //地址码 uchar RAM_CF; uchar RAM_D0; uchar RAM_D1; uchar RAM_D2; //通信地址低字节ASCII uchar RAM_D3; //通信地址高字节ASCII uchar RAM_D4; //用于串口 uchar RAM_D5; //计时单元,2.5MS加1 uchar INPUT_VOLTAGE; //输入电压 220V 对应 163 uchar RAM_D7; //电流 uint RAM_DA; //CH0_RESULTL--->0-10V电压输入--->CH7 10bit //uchar RAM_DB; //CH0_RESULTH uchar RAM_DF; //CH1_RESULTH--->输入电压--->CH6 uchar RAM_E3; //CH3_RESULTH--->温度--->CH5 uchar RAM_E7; //CH4_RESULTH--->A相电压--->CH4 uchar RAM_EB; //CH5_RESULTH--->B相电压--->CH3 //uchar RAM_EE; //CH6_RESULTL uchar RAM_EF; //CH6_RESULTH uchar RAM_F3; //CH7_RESULTH--->C相电压--->CH2 uchar RAM_F7; //CH8_RESULTH--->电流--->CH1 uint RAM_FA; //CH9_RESULTH--->4-20MA--->CH0 10BIT uchar an_adc_cnt; //用于对模拟输入4-20MA,0-10V的A/D累加次 uint RAM_0126; uint RAM_019A; uint RAM_019C; //模拟信号输入的频率(0-10V)+(4-20MA) uint RAM_019E; //模拟输入的A/D累加值(0-10V)+(4-20MA) ulong RAM_01A0; //第一加速频率步进 ulong RAM_01A4; //第一减速频率步进 ulong RAM_01A8; //第二加速频率步进 ulong RAM_01AC; //第二减速频率步进 ulong RAM_01B0; //点动加减频率步进 uint RAM_01B4; uint RAM_01B6; uchar RAM_01B8; uchar RAM_01B9; uint RAM_01BC; uint RAM_01BE; uint RAM_01C0; uint RAM_01C2; //对输入电压做滤波, 用于AVR稳压 uint RAM_01C4; uint RAM_01C6; uchar RAM_01C8; uchar RAM_01C9; uchar RAM_01CA; uchar RAM_01CB; uchar RAM_01CC; uchar RAM_01CD; uchar RAM_01CE; //标志 uchar RAM_01CF; //用于暂时保存RAM_0129 uint RAM_01D0; //用于慢速上频率,下频率延时 uint RAM_01D2; //用于过压,欠压延时 uint RAM_01D4; //跳跃频率宽度 + 跳跃频率二 uint RAM_01D6; //跳跃频率宽度 + 跳跃频率一 uint RAM_01D8; //用于保存处理后的模拟A/D输入 uint RAM_01DA; //用于调整参数,数码闪动计时 uchar fg_2ms5; uchar fg_1sec; uint v1,v2; uint *freq_tab[] = {&RAM_0198,&RAM_016E,&RAM_0170,&RAM_0172, &RAM_0174,&RAM_0176,&RAM_0178,&RAM_017A, &RAM_017C,&RAM_019C,&RAM_96,&RAM_019A, &RAM_0168,&RAM_016A,&RAM_017C,&RAM_0184, &RAM_018A,&RAM_018E,&RAM_0192,&RAM_0194, &RAM_017C,&RAM_019C,&RAM_96,&RAM_019A, }; /*Declare constants/coefficients/calibration data to be stored in DataEEPROM*/ uchar _EEDATA(32) fooArrayInDataEE[] = {0, //00 主频率输入设定 0 8 //从RAM_0128 ---- RAM_0199 对应93C的内容 2, //01 运转指令来源设定 2 4 0, //02 电机停机方式设定 0 3 0, //15 S-曲线加速选择 0 7 0, //24 反转禁止功能 0 1 1, //25 过电压失速防止功能 1 1 170, //26 过电流失速防止-->加速中 170% 200% 170, //27 过电流失速防止-->运转中 170% 200% 25, //28 直流制动-->直流制动电压准位 25 50 0, //29 直流制动-->启动时直流制动时间 0 50 5, //30 直流制动-->停止时直流制动时间 5 250 0, //32 瞬时停电再启动-->运转方式 0 2 20, //33 瞬时停电再启动-->停电之****时间 20 50 5, //34 瞬时停电再启动-->复电后追踪时间 5 50 150, //35 瞬时停电再启动-->速度追踪之****电流 150% 200% 0, //38 外部运行指令-->二线/三线运转控制 0 3 0, //39 多功能输入端子-->端子一 0 23 1, //40 多功能输入端子-->端子二 1 23 2, //41 多功能输入端子-->端子三 2 23 0, //50 模拟输出频率/电流-->模拟信号输出 0 1 100, //44 类比输出增益 100% 200% 0, //45 多功能输出端子功能选择 0 9 1, //46 保留 1 9 100, //48 模拟输入/频率曲线-->最高频率模拟量 100 100 3, //49 模拟输入/频率曲线-->最低频率模拟量 3 100 0, //70 跳跃频率--->跳跃频率宽度 0 200 100, //52 电机运转资料-->电机额定电流 100% 120% 40, //53 电机运转资料-->电机空载电流 40% 99% 0, //54 自动转矩补偿增益 0 100 0, //55 自动转差补偿增益 0 100 0, //57 多功能输出接点 0 6 1, //51 AVR自动稳压功能设定 1 1 0, //60 过转矩检出功能 0 4 150, //61 过转矩检出准位 150% 200% 13, //62 过转矩检出时间 13 100 0, //64 功能显示项目--->显示项目 0 12 5, //42 多功能输入端子-->端子四 5 23 2, //71 PWM频率 2 5 0, //72 故障后,自动重置/启动次数 0 10 7, //73 故障-->最近第一次故障代号 7 13 1, //74 故障-->最近第二次故障代号 1 13 1, //75 故障-->最近第三次故障代号 1 13 0, //76 参数锁定/初始化 0 10 2, //77 通信速率 2 2 0, //78 通信地址 0 31 2, //43 保留 2 20 BYTE_DATA(6000), //03 V/F曲线-->最高操作频率 6000 40000 BYTE_DATA(5000), //04 V/F曲线-->基频 5000 40000 BYTE_DATA(2200ul*2*21/22), //0x68,0x10, //05 V/F曲线-->基压 360 5100 BYTE_DATA(150), //06 V/F曲线-->中间频率 150 40000 BYTE_DATA(200), //07 V/F曲线-->中间电压 200 5100 BYTE_DATA(150), //08 V/F曲线-->最低输出频率 150 2000 BYTE_DATA(200), //09 V/F曲线-->启动电压 200 1000 BYTE_DATA(17), //10 加减速时间-->第一加速时间 2 9999 ---->改动 BYTE_DATA(24), //11 加减速时间-->第一减速时间 2 9999 ---->改动 BYTE_DATA(2), //12 加减速时间-->第二加速时间 2 9999 BYTE_DATA(4), //13 加减速时间-->第二减速时间 4 9999 BYTE_DATA(100), //14 点动加减速时间 100 9999 BYTE_DATA(4500), //16 多段速-->第一段频率选择 4500 40000 BYTE_DATA(4000), //17 多段速-->第二段频率选择 4000 40000 BYTE_DATA(3500), //18 多段速-->第三段频率选择 3500 40000 BYTE_DATA(3000), //19 多段速-->第四段频率选择 3000 40000 BYTE_DATA(2500), //20 多段速-->第五段频率选择 2500 40000 BYTE_DATA(2000), //21 多段速-->第六段频率选择 2000 40000 BYTE_DATA(800), //22 多段速-->第七段频率选择 1500 40000 ---->改动 BYTE_DATA(500), //23 点动频率先择 500 40000 BYTE_DATA(0), //31 停止时直流制动起始频率 0 6000 BYTE_DATA(20000), //36 输出频率上限 20000 40000 BYTE_DATA(0), //37 输出频率下限 0 40000 BYTE_DATA(0), //47 任意达到频率 0 40000 BYTE_DATA(0), //56 保留 0 0 BYTE_DATA(60), //59 保留 60 300 BYTE_DATA(5), //63 保留 5 9999 BYTE_DATA(60), //65 比例常数 60 2000 BYTE_DATA(10), //66 计数值到达功能设定 10 9999 0xFF, //FFH 40000 用于计算输入压比例 0xFF, //FFH BYTE_DATA(0), //68 跳跃频率--->跳跃频率一 0 40000 BYTE_DATA(0), //69 跳跃频率--->跳跃频率二 0 40000 0,0, //80 本机规格 0 9999 BYTE_DATA(5000), //58,79 用户自定义频率 5000 40000 -->67 用户自定义频显示(只读) 0,0, }; _prog_addressT EE_addr; #include "scan_key.c" #include "display.c" #include "timer1.c" //===================================================================================== void UART_Init() { U2MODE = 0x8000; U2STA = 0; U2BRG = ((FCY/16)/19200) - 1; U2STAbits.UTXEN = 1; } //===================================================================================== void UartSendByte(uchar n) { while(U2STAbits.UTXBF); U2TXREG = n; } //===================================================================================== void SendString(char *s) { while(*s) UartSendByte(*s++); } //===================================================================================== void SendHex(uint n) { int i; uchar k; for(i = 0;i<4;i++) { k = n >> 12; if(k > 9) k+=7; k+= 0x30; UartSendByte(k); n <<= 4; } } //===================================================================================== void SendDec(uint n) { uchar i; uchar buf[5]; for(i=0;i<5;i++) {buf[i] = (n % 10) + 0x30; n /= 10; } for(i = 0;i<5;i++) UartSendByte(buf[4-i]); } //===================================================================================== void Debug() { if(fg_1sec == 0) return; fg_1sec = 0; SendString("==================\n"); SendString("RAM_4C="); SendDec(RAM_4C); SendString("\n"); SendString("PWM周期="); SendDec(pwm_cycle[RAM_014D]); SendString("\n"); SendString("输出电压="); SendDec(v1); SendString("\n"); SendString("输入电压="); SendDec(v2); SendString("\n"); SendString("RAM_90="); SendDec(RAM_90); SendString("\n"); } //===================================================================================== //Functions: //ADC_Init() is used to configure A/D to convert 16 samples of 1 input //channel per interrupt. The A/D is set up for a sampling rate of 1MSPS //Timer3 is used to provide sampling time delay. //The input pin being acquired and converted is AN7. void ADC_Init(void) { //ADCON1 Register //Set up A/D for Automatic Sampling //Use internal counter (SAMC) to provide sampling time //Set up A/D conversrion results to be read in 1.15 fractional //number format. //Set up Sequential sampling for multiple S/H amplifiers //All other bits to their default state ADCON1bits.FORM = 0; ADCON1bits.SSRC = 7; //转换触发源选择位,111表示采样结束自动转换 ADCON1bits.ASAM = 0; //自动采样 ADCON1bits.SIMSAM = 0; //ADCON2 Register //Set up A/D for interrupting after 2 samples get filled in the buffer //Set up to sample on 2 S/H amplifiers - CH0 and CH1 //All other bits to their default state ADCON2bits.SMPI = 0; //采样一次就中断 ADCON2bits.CHPS = 1; //ADCON2bits.VCFG = 3; //Ideally use external references //ADCON3 Register //We would like to set up a sampling rate of 1 MSPS //Total Conversion Time= 1/Sampling Rate = 125 microseconds //At 29.4 MIPS, Tcy = 33.9 ns = Instruction Cycle Time //The A/D converter will take 12*Tad periods to convert each sample //So for ~1 MSPS we need to have Tad close to 83.3ns //Using equaion in the Family Reference Manual we have //ADCS = 2*Tad/Tcy - 1 ADCON3bits.ADRC = 0; ADCON3bits.SAMC = 31; ADCON3bits.ADCS = 63; //调节Tcy与Tad的关系,范围0~63,63是最慢的 //ADCHS Register //Set up A/D Channel Select Register to convert AN3 on Mux A input //of CH0 and CH1 S/H amplifiers ADCHS = 0x0000; //ADCSSL Register //Channel Scanning is disabled. All bits left to their default state ADCSSL = 0x0000; //ADPCFG Register //Set up channels AN7 as analog input and configure rest as digital //Recall that we configured all A/D pins as digital when code execution //entered out of reset ADPCFG = 0xFF80; //选择端口的模式,模拟/数字,0表示选中模拟采样 //Clear the A/D interrupt flag bit IFS0bits.ADIF = 0; //Set the A/D interrupt enable bit IEC0bits.ADIE = 1; //Turn on the A/D converter //This is typically done after configuring other registers ADCON1bits.ADON = 1; ADCON1bits.SAMP = 1; /* ADPCFG=0x0000; //选择端口的模式,模拟/数字,0表示选中模拟采样 ADCON1bits.ADSIDL=0; //AD模块一直工作,即使在空闲模式 ADCON1bits.ASAM=0; //选择了手动采样模式,当SAMP位置1后才开始采样 ADCON2bits.VCFG=0B000; //参考电压选择,bit15:13,000选择电源参考,AVDD、AVSS ADCON3bits.ADRC=1; //1表示使用内部RC时钟,0表示使用系统FOSC时钟 ADCON3bits.ADCS=8; //调节Tcy与Tad的关系,范围0~63,63是最慢的 ADCON2bits.CSCNA=0; //不自动扫描输入 ADCON2bits.CHPS=0B11; //同时扫描的通道数,转换CH0、CH1、CH2、CH3 ADCON1bits.SSRC=0B111; //转换触发源选择位,111表示采样结束自动转换 ADCON3bits.SAMC=4; //自动采样时间为31个Tad,范围0~31 ADCON1bits.FORM=0B00; //数据格式,整数格式,右对齐 ADCON2bits.ALTS=0; //总是使用多路开关A来作为通道选择位 ADCHSbits.CH0NA=0; //通道0的反向输入端为VREF-,但,参考电压选择AVDD和AVSS,所以VREF-为0 ADCON1bits.ADON=1; //打开ADC模块 */ } //_ADCInterrupt() is the A/D interrupt service routine (ISR). //The routine must have global scope in order to be an ISR. //The ISR name is chosen from the device linker script. void __attribute__((__interrupt__)) _ADCInterrupt(void) { uint a; switch(ADCHS & 0x7) { case 0: RAM_FA = ADCBUF0; ADCHS = 0x0001; break; case 1: RAM_F7 = ADCBUF0 >> 2; ADCHS = 0x0002; break; case 2: RAM_F3 = ADCBUF0 >> 2; ADCHS = 0x0003; break; case 3: RAM_EB = ADCBUF0 >> 2; ADCHS = 0x0004; break; case 4: RAM_E7 = ADCBUF0 >> 2; ADCHS = 0x0005; break; case 5: RAM_E3 = ADCBUF0 >> 2; ADCHS = 0x0006; break; case 6: RAM_DF = ADCBUF0 >> 2; ADCHS = 0x0000; break; //case 7: // RAM_DA = ADCBUF0; // ADCHS = 0x0000; // break; } INPUT_VOLTAGE = (uint)RAM_DF * (uint)RAM_0190 / 100; a = RAM_F7 - RAM_F7/16; a *= RAM_0191; if(a > 25488) a = 25488; RAM_D7 = a / 100; if((RAM_B6 & 1) && (RAM_B6 & 0x08) ==0 && INPUT_VOLTAGE > RAM_01B9) ERROR_TURN_OFF = 0; else ERROR_TURN_OFF = 1; ADCON1bits.SAMP = 1; IFS0bits.ADIF = 0; } /*--------------------------------------------------------------------- Function Name: INT1Interrupt Description: INT1 pin Interrupt Handler Inputs: None Returns: None -----------------------------------------------------------------------*/ void _ISR _INT1Interrupt( void ) { /* reset interrupt flag */ IFS1bits.INT1IF = 0; } /*-----------------------------------------------------------------------*/ void _ISR _PWMInterrupt( void ) { uint RAM_24; //A相比较值 uint RAM_26; //B相比较值 uint RAM_28; //C相比较值 IFS2bits.PWMIF = 0; // Clear interrupt flag uint index = RAM_40 >> 16; switch(RAM_38 >> 1) { case 0: RAM_24 = PTPER + (__builtin_muluu(RAM_4C,wave_tab1[index])>>16); RAM_26 = PTPER + (__builtin_muluu(RAM_4C,wave_tab1[999 - index])>>16); RAM_28 = PTPER - (__builtin_muluu(RAM_4C,wave_tab2[index])>>16); if(RAM_28 & 0x8000) RAM_28 = 0; break; case 1: RAM_24 = PTPER + (__builtin_muluu(RAM_4C,wave_tab2[index])>>16); RAM_26 = PTPER - (__builtin_muluu(RAM_4C,wave_tab1[index])>>16); RAM_28 = PTPER - (__builtin_muluu(RAM_4C,wave_tab1[999 - index])>>16); if(RAM_26 & 0x8000) RAM_26 = 0; if(RAM_28 & 0x8000) RAM_28 = 0; break; case 2: RAM_24 = PTPER + (__builtin_muluu(RAM_4C,wave_tab1[999 - index])>>16); RAM_26 = PTPER - (__builtin_muluu(RAM_4C,wave_tab2[index])>>16); RAM_28 = PTPER + (__builtin_muluu(RAM_4C,wave_tab1[index])>>16); if(RAM_26 & 0x8000) RAM_26 = 0; break; case 3: RAM_24 = PTPER - (__builtin_muluu(RAM_4C,wave_tab1[index])>>16); RAM_26 = PTPER - (__builtin_muluu(RAM_4C,wave_tab1[999 - index])>>16); RAM_28 = PTPER + (__builtin_muluu(RAM_4C,wave_tab2[index])>>16); if(RAM_24 & 0x8000) RAM_24 = 0; if(RAM_26 & 0x8000) RAM_26 = 0; break; case 4: RAM_24 = PTPER - (__builtin_muluu(RAM_4C,wave_tab2[index])>>16); RAM_26 = PTPER + (__builtin_muluu(RAM_4C,wave_tab1[index])>>16); RAM_28 = PTPER + (__builtin_muluu(RAM_4C,wave_tab1[999 - index])>>16); if(RAM_24 & 0x8000) RAM_24 = 0; break; case 5: RAM_24 = PTPER - (__builtin_muluu(RAM_4C,wave_tab1[999 - index])>>16); RAM_26 = PTPER + (__builtin_muluu(RAM_4C,wave_tab2[index])>>16); RAM_28 = PTPER - (__builtin_muluu(RAM_4C,wave_tab1[index])>>16); if(RAM_24 & 0x8000) RAM_24 = 0; if(RAM_28 & 0x8000) RAM_28 = 0; break; }