单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 58|回复: 3
打印 上一主题 下一主题
收起左侧

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转换程序错误,没有转换完成判断
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机 联系QQ:125739409;技术交流QQ群582644647

Powered by 单片机教程网

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