单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 651|回复: 8
收起左侧

STC8单片机的ADC转化结果去控制PWM频率输出,怎么没反应啊

[复制链接]
17851000590 发表于 2019-9-12 10:02 | 显示全部楼层 |阅读模式
  
/********************************************************
        功能  :用电位器通过STC8AD片内AD和PWM控制电机转速
        单片机;STC8AD
        晶振  :12M
        作者  :张骏杰
        时间  :2019-11-4
********************************************************/
#include<STC8.H>        
#include <intrins.h>   
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define  uint16   unsigned int
#define  uint8   unsigned int

uint M;

/**************************************
功能描述:延时函数
入口参数:uint16 x ,该值为1时,延时1ms
返回值:无
***************************************/
void delay_ms(uint16 x)
{  
uint16 j,i;   
for(j=0;j<x;j++)   
{   
  for(i=0;i<1100;i++);   
}  
}

void PCAInit(void)
{
   P_SW1 &= 0xCF;
         CMOD=0x04; //设置PCA定时器
   CCON=0x00;
    AUXR|=0x80;
   TMOD&=0xF0;
   TL0=0x10;
   TH0=0xff;
         //定时器0开始计时
         CL=0;
         CH=0;
   
         CCAPM0=0x42; //PWM0设置PCA工作方式为PWM方式(0100 0010)
         CCAP0L=0x00; //设置PWM0初始值与CCAP0H相同
         CCAP0H=0x00; // PWM0初始时为0
     PCA_PWM0 &= 0x3F;       //PCA模块0工作于8位PWM功能

   
         CR=1; //启动PCA定时器
}

/**************************************
功能描述:ADC口初始化
入口参数:无
返回值:无
***************************************/
void ADC_config(void)
{
ADC_CONTR|=0x80;       //开AD转换电源
delay_ms(10);           //适当延时等待AD转换供电稳定
ADC_CONTR|=0x0E;     //选择P0.6作为模拟功能AD使用
ADC_CONTR&=0xFE;     //选择P0.6作为模拟功能AD使用

ADCCFG&=0xFC;             //AD转换速度为96个时钟周期转换一次
ADCCFG|=0x0C;             //AD转换速度为96个时钟周期转换一次
ADC_CONTR&=0xDF;          //清AD转换完成标志
  
EADC=0;                   //禁止ADC转换中断
ADCCFG|=0x20;             //ADC转换结果ADC_RES存高4位,ADC_RESL存低8位
ADC_CONTR|=0x40;          //启动AD转换,ADC_START=1
}
/**************************************
功能描述:ADC口检测AD转换值函数
入口参数:无
返回值:ADC 12位数据
***************************************/
uint16 Get_ADC12bitResult(void)
{
uint16 AD_Dat=0;
   ADC_CONTR&=0xDF;       // 将ADC_FLAG清0
ADC_CONTR&=0xBF;        //关闭AD转换,ADC_START=0
//12位AD结果的高4位放ADC_RES的低4位,低8位在ADC_RESL
AD_Dat = ADC_RES;         //将ADC_RES低4位移到应在的第9位至第12位
AD_Dat <<= 8;
AD_Dat|= ADC_RESL;        //将ADC_RESL的8位移到应在的低8位

   ADC_CONTR|=0x40;           //启动AD转换,ADC_START=1
return AD_Dat;
}
void PWM0_set(unsigned char a)
{
  
if(a==0XFF)
{
PCA_PWM0=0X03;
}
else
{
PCA_PWM0=0x00;
CCAP0L=a;
CCAP0H=a;
}
}

void main (void)
{
    ADC_config();
       PCAInit(); //PWM初始化
       while(1)
       {         
  M=Get_ADC12bitResult ;   
        PWM0_set(M); //转换结果为PWM0赋值 输出占空比 ·
       }
}

hjx5548 发表于 2019-9-12 13:32 | 显示全部楼层
两者没有关联吧
 楼主| 17851000590 发表于 2019-9-12 15:20 | 显示全部楼层
hjx5548 发表于 2019-9-12 13:32
两者没有关联吧

有关联啊,电位器转化的结果赋值给PWM
tyrl800 发表于 2019-9-12 18:13 | 显示全部楼层
AD转换程序错误,没有转换完成判断
wulin 发表于 2019-9-12 21:22 | 显示全部楼层
错误多多,给你一个示例,自己对照查错。
  1. #include <STC8.H>
  2. #include "intrins.h"
  3. //测试工作频率为11.0592MHz
  4. void main()
  5. {
  6.     CCON = 0x00;
  7.     CMOD = 0x08;           //PCA时钟为系统时钟
  8.     CL = 0x00;
  9.     CH = 0x00;
  10.     CCAPM0 = 0x42;    //PCA模块0为PWM工作模式
  11.     PCA_PWM0 = 0x00;  //PCA模块0输出8位PWM
  12.     CCAP0L = 0xff;    //PWM占空比为50%[(40H-20H)/40H]
  13.     CCAP0H = 0xff;
  14.     CR = 1;           //启动PCA计时器

  15.     P1M0 = 0x00;     //设置P1.0为ADC口
  16.     P1M1 = 0x01;
  17.     ADCCFG = 0x0f;           //设置ADC时钟为系统时钟/2/16/16
  18.     ADC_CONTR = 0x80;  //使能ADC模块

  19.     while (1)
  20.     {
  21.         ADC_CONTR |= 0x40; //启动AD转换
  22.         _nop_();
  23.         _nop_();
  24.         while (!(ADC_CONTR & 0x20));//查询ADC完成标志
  25.         ADC_CONTR &= ~0x20;         //清完成标志
  26.         CCAP0H = ADC_RES;           //读取8位ADC结果控制PWM
  27.     }
  28. }
复制代码
 楼主| 17851000590 发表于 2019-9-14 22:28 | 显示全部楼层
wulin 发表于 2019-9-12 21:22
错误多多,给你一个示例,自己对照查错。

谢谢你,我学了2个月,很多问题,谢谢你们
 楼主| 17851000590 发表于 2019-9-14 22:29 | 显示全部楼层
tyrl800 发表于 2019-9-12 18:13
AD转换程序错误,没有转换完成判断

谢谢你,我学了2个月,很多问题,谢谢你们
 楼主| 17851000590 发表于 2019-9-15 21:18 | 显示全部楼层
17851000590 发表于 2019-9-14 22:28
谢谢你,我学了2个月,很多问题,谢谢你们

大哥,你的电位器可以调节占空比,但是调节不了频率,无法改变电机快慢
liuguonianhua 发表于 2019-12-17 15:13 | 显示全部楼层
一个非常重要的问题:如何保证ADC采集的数据是你想要的数据。STC单片机的ADC只能采集到正电压数据,负电压数据采不到。PWM是一个方波,在ADC采集的时候,不能保证采集点落在方波的哪个区间,所以哪怕是理想情况下,ADC采集的数据是每次都不一样的。还有PWM和ADC频率匹配的问题,以及layout时寄生电容电感引发的PWM波形畸变,致使ADC采集的数据更加的不准确。最最重要的一点,STC单片机不能并发运行,也就是说,在ADC采集数据的时候,单片机此时已经停止了PWM波的输出,那么这个时候ADC采集到的只是由于电路的电容效应残留的电压值,你说,ADC能采集的准你想要的数据才怪!STC的单片机目前只能采集恒压!!!!!!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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