Y_G_G 发表于 2018-11-27 10:38 大佬,你也没把电路贴出来参考一下啊。 |
|
每周只有周末有时间弄弄,12月2日的进度 编码器和PWM抄了一段程序,各种编译错误请各位高人指点指点。 1、编码器函数,Encoder_EC11_Scan() 是判断编码器旋转方向,EC11_Key_Scan()是判断编码器按键状态 //----------------EC11 编码器扫描函数----------------// char Encoder_EC11_Scan() /* 这里只是部分代码 */ { char ScanResult = 0; //返回编码器扫描结果,用于分析编码器的动作 //返回值的取值: 0:无动作; 1:正转; -1:反转; if(EC11_A_Now != EC11_A_Last) //以A为时钟,B为数据。正转时AB反相,反转时AB同相 { if(EC11_A_Now == 0) { if(EC11_B_Now ==1) //只需要采集A的上升沿或下降沿的任意一个状态,若A下降沿时B为1,正转 ScanResult = 1; //正转 else //反转 ScanResult = -1; } EC11_A_Last = EC11_A_Now; //更新编码器上一个状态暂存变量 EC11_B_Last = EC11_B_Now; //更新编码器上一个状态暂存变量 } return ScanResult; //返回值的取值: 0:无动作; 1:正转; -1:反转; } //----------------EC11 按键扫描函数----------------// int EC11_Key_Scan() { unsigned int i = 0; if(EC11_Key == 1 && i == 0) { delay_ms(1); if(EC11_Key == 1) { i = 1; } } /* else if(EC11_Key == 1 && i == 1) { delay_ms(1); if(EC11_Key == 1) { i = 2; } } else if(EC11_Key == 1 && i == 2) { delay_ms(1); if(EC11_Key == 1) { i = 3; } } */ else { i = 0; } return i; } 2、PWM pwm_init(void) 是初始化,pwm_set0(unsigned int x) pwm_set1(unsigned int x) 为设置两个通道的占空比 //----------------PWM初始化函数----------------// void pwm_init(void) //PWM初始化函数,初始占空比为0 { CMOD=0x02; //0000 0010 空闲时不计数,不产生中断,时钟源为fosc/2,因此输出占用率为fosc/512 CL=0x00; CH=0x00; AUXR1 = 0x10; //切换IO口 CCAPM0=0x42; //0100 0010, 8位 PWM CCAPM1=0x42; //0100 0010, 8位 PWM CCAP0L=0x00; CCAP0H=0x00; //PWM实现方法,因为是8位,CL基础计数器从0xFF递减到0x00,溢出后将CCAP0H //的值加载到CCAP0L,若CL递减过程中,若大于CCAP0L,则输出高电平,否则为低电平 CCAP1L=0x00; CCAP1H=0x00; CR=1; //开启PCA计数器 } void pwm_set0(unsigned int x) //占空比设置函数 { if(x>255) x=255 ; if(x<10) x=10 ; CCAP0H=x; //设置比较值 CCAP0L=x; } void pwm_set1(unsigned int x) //占空比设置函数 { if(x>255) x=255 ; if(x<5) x=5 ; CCAP1H=x; //设置比较值 CCAP1L=x; } 3、主函数这里一堆错误, if EC11_Key_Scan()==1 判断按键未按下,为电压调节模式 { if Encoder_EC11_Scan()==1 编码器正传 { pwm_0=pwm_0++; pwm_set0(pwm_0); 占空比增大 } if Encoder_EC11_Scan()==-1 编码器反传 { pwm_0=pwm_0--; pwm_set0(pwm_0); 占空比减小 } } if EC11_Key_Scan()==0 按键按下,为电流调节模式 { if Encoder_EC11_Scan()==1 {pwm_1=pwm_1++; pwm_set1(pwm_1); } if Encoder_EC11_Scan()==-1 { pwm_1=pwm_1--; pwm_set1(pwm_1); } } 4、一堆错误 MAIN.C(212): error C141: syntax error near 'EC11_Key_Scan', expected '(' MAIN.C(213): error C141: syntax error near '{' MAIN.C(215): error C141: syntax error near '{' MAIN.C(218): error C141: syntax error near 'Encoder_EC11_Scan', expected '(' MAIN.C(219): error C141: syntax error near '{' MAIN.C(223): error C141: syntax error near 'EC11_Key_Scan', expected '(' MAIN.C(224): error C141: syntax error near '{' MAIN.C(225): error C141: syntax error near '{' MAIN.C(228): error C141: syntax error near 'Encoder_EC11_Scan', expected '(' MAIN.C(229): error C141: syntax error near '{' |
|
你这数控电源精度上基本没有保证的,能50mV的精度就很好了。 用我的方案吧,我的板子打样还没有回来,这个是改动好几次的版本了,输出电流6A,输入电压12V,步进可调的精度±5mV,温度漂移取决于TL431 单片机用STC8系列的,它有个12位的ADC是目前STC中ADC最高精度的单片机之一。另外,还可以增加反馈线,输出4.20V电压,5.5A电流,电压下降0.02V,也就是输出4.18V,参数基本上是工业级 但是,电流的转换还没有搞定,因为还没有找到好的取样电阻。 至于你的程序,首先要把显示和编码开关搞好,一步一步来,先写一个可以转动编码开关,一个变量跟着增加,然后在显示出来,至于计算,留在后面慢慢来 自下而上,一个一个的小功能写好,要不一下写完整个程序,这样会很乱的。 编码开关用中断,1mS或者2mS一次扫描就可以了,这样不影响显示。 |
| 有人来吗? |