欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
單片機(jī)ADC準(zhǔn)換的值作為PWM的占空比!弄很久一直沒(méi)有弄出來(lái)!
[打印本頁(yè)]
作者:
Yusheng哥
時(shí)間:
2020-5-5 09:37
標(biāo)題:
單片機(jī)ADC準(zhǔn)換的值作為PWM的占空比!弄很久一直沒(méi)有弄出來(lái)!
求大佬幫看一下,ADC準(zhǔn)換的值作為PWM的占空比!弄很久一直沒(méi)有弄出來(lái)!時(shí)鐘用的單片機(jī)內(nèi)部22.1184mhz 身邊沒(méi)有示波器!ADC已通過(guò)串口調(diào)試過(guò)了沒(méi)有問(wèn)題!唯獨(dú)PWM沒(méi)有搞定,還有一個(gè)問(wèn)題想請(qǐng)教一下大佬們,直流電機(jī)用PWM調(diào)速一般用多大的頻率合適?STC8位PWM如果采用定時(shí)器0的溢出值作為PCA的時(shí)鐘,那么定時(shí)器的初始值該怎么計(jì)算,之前參考過(guò)好多篇文章,始終沒(méi)有解決 源程序已經(jīng)打包了,所以在這里求一個(gè)具體的計(jì)算方法 最后謝謝各位大佬了!!!
#include <STC8.H>
#include <math.h>
#include <uart.H> // 導(dǎo)入串口庫(kù)文件
//#include <PWM.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
void adc_init(void);
void delay100ms(void); //誤差 -0.000000000013us
void PWM_init(void);
void PWM_u8init(void);
void PWM_set(uchar PWM);
void InitTimer0(void);
#define uchar unsigned char
#define uint unsigned int
sbit PWM = P1^1;
/******************************************************************
主函數(shù)
******************************************************************/
char Data;
void main(void)
{
AUXR = AUXR|0x80; // T0, 1T Mode
InitTimer0();
adc_init(); //ADC 初始化
UartInit(); // Uart 初始化
// PWM_init();
PWM_u8init();
UartSendStr("Uart test\r\t");//Uart 發(fā)送測(cè)試
while(1)
{
// SBUF = Data;
PWM_set(Data);
// PWM = 1;
// delay100ms();
// PWM = 0;
delay100ms();
}
}
/******************************************************************
ADC啟動(dòng)函數(shù)
******************************************************************/
void adc_init(void)
{
P1M0 = 0x00;
P1M1 = 0x01; //設(shè)置P1.0口為高阻輸入
ADC_CONTR = 0x80; // 打開(kāi)ADC電源 P1.0作為ADC轉(zhuǎn)換引腳
ADCCFG = 0x0f;
EADC = 1; // 打開(kāi)ADC 中斷
EA = 1; // 打開(kāi)總中斷
ADC_CONTR |= 0x40;//啟動(dòng)ADC轉(zhuǎn)換
}
/******************************************************************
ADC中斷函數(shù)
******************************************************************/
void adc_zhonduan() interrupt 5 using 1
{
ADC_CONTR &= ~0x20;//清楚ADC中斷溢出標(biāo)志位
Data = ADC_RES;//P2讀取ADC的值
ADC_CONTR |=0x40;//繼續(xù)ADC轉(zhuǎn)換
}
/******************************************************************
軟件延時(shí)函數(shù)
******************************************************************/
void delay100ms(void) //誤差 -0.000000000013us
{
unsigned char a,b,c;
for(c=254;c>0;c--)
for(b=229;b>0;b--)
for(a=8;a>0;a--);
_nop_();
_nop_();
}
/******************************************************************
PWM初始化函數(shù)
16位PWM
******************************************************************/
void PWM_init(void)
{
P_SW2 = 0x80;
PWMCKS = 0x00; //PWM時(shí)鐘為系統(tǒng)時(shí)鐘
PWMC = 0x5667; //設(shè)置PWM周期為1000H個(gè)PWM時(shí)鐘 約1khz
PWM0T1 = 0x5215; //在計(jì)數(shù)值為100h地方輸出低電平
PWM0T2 = 0x0452; //在計(jì)數(shù)值為500h地方輸出高電平
PWM0CR = 0x80; //使能
P_SW2 = 0x00;
PWMCR = 0x80; //啟動(dòng)PWM模塊
}
/******************************************************************
PWM初始化函數(shù)
8位PWM
*******************************************************************
寄存器說(shuō)明
CCON PCA控制寄存器
B7 B6 B5 B4 B3 B2 B1 B0
CF CR - - CCF3 CCF2 CCF1 CCF0
CF;計(jì)數(shù)器溢出中斷標(biāo)志
CR:PCA計(jì)數(shù)允許位(1/on)
CCFn:PCA模塊中斷標(biāo)志
********************************************************************
CMOD PCA模式寄存器
B7 B6 B5 B4 B3 B2 B1 B0
CIDL - - - CPS[2:0] ECF
CIDL 空閑模式下是否停止計(jì)數(shù) 0繼續(xù),1停止
CPS[2:0]:PCA的輸入時(shí)鐘 【000|系統(tǒng)時(shí)鐘/12】【001|系統(tǒng)時(shí)鐘/2】【010|定時(shí)器0的溢出脈沖】【100|系統(tǒng)時(shí)鐘】
ECF:PCA計(jì)數(shù)器溢出中斷允許位 0禁止,1允許
********************************************************************
CCAPMN PCA模塊模式控制寄存器
B7 B6 B5 B4 B3 B2 B1 B0
- ECOM0 CCAPP0 CCAPN0 MAT0 TOG0 PWM0 ECCF0
ECOMn:允許PCA模塊n的比較功能
CCAPPN:允許PCA模塊n進(jìn)行上升沿捕獲
CCAPNn:允許PCA模塊n進(jìn)行下降沿捕獲
MATn:允許PCA的匹配功能
TOG0:允許PCA模塊n的高速脈沖是輸出功能
PWMn:允許PCA模塊n的脈寬輸出調(diào)制功能
ECCFn:允許PCA模塊n的匹配/捕獲中斷
******************************************************************/
void PWM_u8init(void)
{
CCON = 0x00;
CMOD = 0x08; //PCA時(shí)鐘為系統(tǒng)時(shí)鐘
CL = 0x00;
CH = 0x00;
CCAPM0 = 0x42; //PCA模塊0為PWM工作方式
PCA_PWM0 = 0x00; //PCA模塊0輸出8位PWM
CCAP0L = 0x10; // 占空比
CCAP0H = 0x10; //占空比
CR = 1; //啟動(dòng)PCA計(jì)時(shí)器
}
/*********************************************************************************************
函數(shù)名:PWM占空比設(shè)置函數(shù)
調(diào) 用:PWM_set(uchar PWM);
參 數(shù):無(wú)
返回值:無(wú)
結(jié) 果:無(wú)
備 注:無(wú)
/**********************************************************************************************/
void PWM_set(uchar PWM)
{
CCAP0L = PWM; // 占空比
CCAP0H = PWM; //占空比
}
/*********************************************************************************************
函數(shù)名:定時(shí)器初始化函數(shù)
調(diào) 用:InitTimer0();
參 數(shù):無(wú)
返回值:無(wú)
結(jié) 果:將定時(shí)器計(jì)數(shù)器初始化為定時(shí)器,工作方式0
備 注:無(wú)
/**********************************************************************************************/
void InitTimer0(void)
{
TMOD = 0x00;
TH0 = (65536-86)/256;//1khz
TL0 = (65536-86)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
/*********************************************************************************************
函數(shù)名:定時(shí)器0中斷處理函數(shù)
調(diào) 用:無(wú)需調(diào)用
參 數(shù):無(wú)
返回值:無(wú)
結(jié) 果:無(wú)
備 注:無(wú)
/**********************************************************************************************/
void Timer0Interrupt(void) interrupt 1
{
TH0 = (65536-86)/256;
TL0 = (65536-86)%256;
}
復(fù)制代碼
ADC.zip
2020-5-5 09:33 上傳
點(diǎn)擊文件名下載附件
75.31 KB, 下載次數(shù): 8
源程序
作者:
Yusheng哥
時(shí)間:
2020-5-5 09:39
發(fā)出的程序格式亂了,就請(qǐng)各位大佬看一下源程序把,謝謝大家了
作者:
Yusheng哥
時(shí)間:
2020-5-6 16:56
不要沉了呀,我頂
作者:
wulin
時(shí)間:
2020-5-7 08:22
不用寫那么多,就把STC的ADC和PWM官方示例整合一下就行。以下程序只是提供編程思路,不代表可以直接使用。
#include <STC8.H>
#include "intrins.h"
void delay100ms(void)
{
unsigned char a,b,c;
for(c=254;c>0;c--)
for(b=229;b>0;b--)
for(a=8;a>0;a--);
_nop_();
_nop_();
}
void main()
{
//初始化PWM
CCON = 0x00;
CMOD = 0x08; //PCA時(shí)鐘為系統(tǒng)時(shí)鐘
CL = 0x00;
CH = 0x00;
CCAPM0 = 0x42; //PCA模塊0為PWM工作模式
PCA_PWM0 = 0x00; //PCA模塊0輸出8位PWM
CCAP0L = 0xff; //PWM占空比為0%
CCAP0H = 0xff;
CR = 1; //啟動(dòng)PCA計(jì)時(shí)器
//初始化ADC
P1M0 = 0x00; //設(shè)置P1.0為ADC口
P1M1 = 0x01;
ADCCFG = 0x0f; //設(shè)置ADC時(shí)鐘為系統(tǒng)時(shí)鐘/2/16/16
ADC_CONTR = 0x80; //使能ADC模塊
while (1)
{
ADC_CONTR |= 0x40; //啟動(dòng)AD轉(zhuǎn)換
_nop_();
_nop_();
while (!(ADC_CONTR & 0x20)); //查詢ADC完成標(biāo)志
ADC_CONTR &= ~0x20; //清完成標(biāo)志
CCAP0H = ADC_RES; //讀取ADC結(jié)果控制PWM,默認(rèn)P0.0輸出
// CCAP0H = ~ADC_RES; //讀取ADC結(jié)果取反控制PWM
delay100ms();
}
}
作者:
怎么起名字
時(shí)間:
2020-5-13 23:33
樓主,我想產(chǎn)生10khz的pwm波應(yīng)該怎么修改呢?
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1