找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4359|回复: 5
收起左侧

STC15f2k16s2单片机制作数控电源的相关问题求助

[复制链接]
ID:60663 发表于 2018-11-25 12:55 | 显示全部楼层 |阅读模式
主控选用STC15f2k16s2,制作数控电源,输出两路pwm,控制TL494分别调节电压和电流。pwm脉宽通过ec11编码器调整,切换使用编码器的按键。怎奈偶是菜鸟,程序变成了一锅粥,搞不定啦,求高人指导一下程序吧。
IMG_20181125_125216.jpg


IMG_20181125_125227.jpg

回复

使用道具 举报

ID:60663 发表于 2018-11-25 13:08 | 显示全部楼层
原理图
捕获.PNG

回复

使用道具 举报

ID:60663 发表于 2018-11-26 22:28 | 显示全部楼层
有人来吗?
回复

使用道具 举报

ID:401564 发表于 2018-11-27 10:38 | 显示全部楼层
你这数控电源精度上基本没有保证的,能50mV的精度就很好了。
用我的方案吧,我的板子打样还没有回来,这个是改动好几次的版本了,输出电流6A,输入电压12V,步进可调的精度±5mV,温度漂移取决于TL431
单片机用STC8系列的,它有个12位的ADC是目前STC中ADC最高精度的单片机之一。另外,还可以增加反馈线,输出4.20V电压,5.5A电流,电压下降0.02V,也就是输出4.18V,参数基本上是工业级
但是,电流的转换还没有搞定,因为还没有找到好的取样电阻。
至于你的程序,首先要把显示和编码开关搞好,一步一步来,先写一个可以转动编码开关,一个变量跟着增加,然后在显示出来,至于计算,留在后面慢慢来
自下而上,一个一个的小功能写好,要不一下写完整个程序,这样会很乱的。
编码开关用中断,1mS或者2mS一次扫描就可以了,这样不影响显示。
回复

使用道具 举报

ID:60663 发表于 2018-12-2 14:07 | 显示全部楼层
每周只有周末有时间弄弄,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 '{'
回复

使用道具 举报

ID:857072 发表于 2022-3-19 09:34 来自手机 | 显示全部楼层
Y_G_G 发表于 2018-11-27 10:38
你这数控电源精度上基本没有保证的,能50mV的精度就很好了。
用我的方案吧,我的板子打样还没有回来,这个 ...

大佬,你也没把电路贴出来参考一下啊。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表