Учебная работа. Курсовая работа: Расчет пленочных резисторов в С
Введение
1. Задание на курсовую работу
2. Разработка метода решения задачки
3. Разработка программки
4. Тестирование и отладка программки
5. Документирование программки
Заключение
Литература
приложение
Введение
Целью данной курсовой работы является получение способностей разработки, отладки, тестирования и документирования программ на языке высочайшего уровня при решении на ЭВМ прикладной инженерной задачки.
В процессе выполнения курсовой работы решены последующие задачки:
Разработан метод синтеза пленочного резистора по данным характеристикам начального резистора.
Разработана программка реализации данного метода на языке С++.
Выполнена отладка и тестирование программки.
Составлена документация на программку и инструкция юзера программкой.
программка оттранслирована и скомпонована в среде MVS-6 в виде консольного приложения.
программка создана для работы под управлением операционной системы WINDOWSXP либо ее наиболее ранешних версий.
При работе программки употребляется обычное оборудование компа: машина — комплекс технических средств, предназначенных для автоматической обработки информации в процессе решения вычислительных и информационных задач) (либо вычислительной системы) которое делает арифметические и логические операции данные программкой преобразования инфы управляет вычислительным действием и коор типа PENTIUM, твердый диск, монитор, клавиатура и мышь.
1.
Задание на курсовую работу
Прикладной инженерной задачей в данной курсовой работе является синтез интегральных резисторов микросхем. Резисторы микросхемы представляют собой полосы узкой пленки в форме прямоугольника либо меандра, как показано на рис. 1.
Рис. 1 Форма пленочного резистора
Расчет резистора заключается в определении его размеров – длины и ширины в случае прямоугольных пленок и ширины , расстояния меж полосами, размеров и , также числа звеньев в случае пленок в форме меандра.
Начальные данные представлены в виде 2-ух групп – данные с переменными и неизменными значениями.
Таблица 1. Начальные данные с переменными значениями
Обозначения и ед
, кОм
, кОм/кв
, мВт
, мВт/мм2
Наименование
Номинальное сопротивление
Сопротивление квадрата резистивной пленки
Мощность рассеяния резистора
Наибольшая удельная мощность рассеяния резистивной пленки
Спектр
Таблица 2. Начальные данные с неизменными значениями
Обозначения и единицы
, мм
, мм
, мм
, мм
, мм
, мм
Наименование
Мало допустимая ширина и длина резистора
Погрешность проигрывания ширины и длины резистора
Допустимая погрешность коэффициента формы
Малое расстояние меж полосами резистора сложной формы
Шаг координатной сетки
Спектр Расчет резисторов производится в последующей последовательности.
Определяется
(1)
Выбирается форма резистора
1. При – резистор прямоугольной формы,
2. При – резистор прямоугольной формы, у которого ,
3. При – резистор сложной формы типа меандр,
4. При – резистор не быть может сконструирован.
Связь меж размерами резистора прямоугольной формы определяется соотношением
(2)
В случае 1
, (3)
где
, (4)
. (5)
Опосля определения длина рассчитывается по формуле (2). Приобретенные значения ширины и длины округляются с учетом шага координатной сетки по формуле
, (6)
где , – целая часть числа.
В случае 2
Определяется длина из выражения
, (7)
где
, (8)
. (9)
Ширина определяется по формуле (2) и значения ширины и длины округляются по формуле (6).
В случае 3
Определяется ширина резистора по формулам (3)–(5). Определяется длина средней полосы меандра из выражения
. (10)
Задается расстояние . Если , то .
Определяется шаг 1-го звена меандра
. (11)
Определяется по приближенной формуле число звеньев меандра
. (12)
Рассчитывается длина и ширина меандра
, (13)
(14)
Проверяется условие
. (15)
Если это условие производится, то расчет заканчивается. По другому, возрастает расстояние на величину и повторяются вычисления по формулам (11)–(14). Если при 10-ти кратном повторении соотношение (15) не производится, то расчет заканчивается с фиксированием факта невозможности синтеза резистора.
Рассмотренная методика расчета применяется к данному количеству резисторов . Спектр значений и для всех резисторов принимается схожими.
2.
Разработка метода решения задачки
Блок-схема головной программки
.
Блок-схема программки расчета характеристик резистора
Блок-схема программки расчета коэффициента формы
Блок-схема программки расчета наибольшего из 3-х чисел
3.
Разработка программки
При программировании применен аппарат функций, реализующих относительно самостоятельные участки метода решения задачки. При составлении программки применялись как функции с аргументами и возвращаемыми значениями, так и функции, имеющие форму процедур без аргументов, в каких использовались глобальные данные программки.
При резервировании памяти использовались динамические массивы, указателям которых присваивались адреса памяти в процессе выполнения программки по количеству введенной инфы. Для данной нам цели в языке С++ более комфортно применять оператор
<указатель>= new<тип массива>[<количество частей массива>];
При программировании меню удобнее всего применять оператор switch (<условие>) {case <
При организации циклов применены три вида операторов:
for (i=<нач. знач>; i<<кон. знач>; i++) {<исполняемый код>};
do {<исполняемый код>} while (<условие повторения>);
while (<условие повторения>) {<исполняемый код>}.
4.
Тестирование и отладка программки
При тестировании программки были рассчитаны все варианты синтеза пленочного резистора для нескольких начальных значений сопротивления, мощности рассеяния резистора и удельной мощности рассеяния пленки. Результаты тестирования, приведенные в приложении, проявили правильность синтеза пленочного резистора.
5.
Документирование программки
При запуске программки в среде WINDOWSXP в консольном приложении в окне программки возникает меню, состоящее из 3‑х пт:
1. ввода данных с контролем их значений как зрительно, так и по данному допустимому спектру,
2. выполнения расчетов с отображением результатов,
3. выхода из программки.
Если ввод данных не был произведен, то расчетная часть программки автоматом блокируется и предлагается или ввести данные, или выйти из программки.
При вводе данных предлагается ввести количество резисторов. Опосля этого поочередно поступает на экран предложения ввести сопротивление резистора и его рассеиваемую мощность. количество предложений формируется автоматом.
Потом предлагается указать тип ввода : по списку либо по спектру с данным шагом. В первом случае предлагается ввести количество частей перечня, а потом поступают предложения ввода значений . Количество предложений контролируется автоматом. Во 2-м случае предлагается ввести изначальное, конечное и шаг его конфигурации.
Опосля ввода предлагается ввести . Все значения и являются схожими для всех начальных резисторов.
На этом шаг ввода завершается и выводится введенная информация для зрительного контроля. При вводе данных автоматом контролируется их допустимый спектр.
При расчете предлагается ввести номер резистора, для которого нужно провести синтез пленки. Если номер резистора выходит за границы их количества, то предлагается ввести новейший корректный номер.
Опосля ввода номера резистора осуществляется расчет характеристик пленки с автоматическим выбором ее геометрии. Результаты расчета выводятся на экран в виде записей, отсортированных по растущей величине . Не считая того выводится наибольшее .
Дальше выводится начальное меню и работа с программкой быть может повторена.
Заключение
1. Внедрение программирования на языке С++ дозволяет воплотить сложные, многовариантные методы синтеза пленочных резисторов с автоматическим выбором геометрии пленки.
2. Данный язык программирования дозволяет выстроить диалоговые программки с автоматическим управлением диалога и слежением за правильностью значений вводимых начальных данных.
3. Компилятор языка С++ строит эффективную по быстродействию программку и дозволяет применять динамическое распределение памяти, что дает возможность сделать малогабаритные по размерам программки.
Литература
1. С++ за 21 денек.
2. Программирование на С++. Учеб. пособие / Под ред. А.Д. Хомоненко. – С-Пб.: 1999.
3. Освоение BORLANDC++ 4.5. Т1,2. К. Диалектика, 1996.
Приложение
#defineWIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <conio.h>
#include <iomanip>
#include <math.h>
usingnamespacestd; // внедрение обычного места имен
// Не изменяемые расчетные характеристики
doublebt=0.1; // Техн.
doublelt=0.3; // Техн.
doubleDb=0.01; // Погрешность проигрывания ширины
doubleDl=0.03; // Погрешность проигрывания длины
doublegamma=0.1; // Допустимая погрешность коэф. формы
doubleamin=0.3; // Макс. расстояние меж полосами пленки сложной формы (изменено)
doubleh=0.05; // Шаг сетки
// Ограничения значений начальных данных
doubleRdown=0.05; // Мин.
doubleRup=10000; // Макс.
doublerhodown=0.001; // Мин.
doublerhoup=1000; // Макс.
doublePdown=5; // Мин. зсначение рассеиваемой мощности резистора
doublePup=50; // Макс.
doublePodown=10; // Мин. зсначение удельной рассеиваемой мощности пленки
doublePoup=30; // Макс. зсначение удельной рассеиваемой мощности пленки
double R, rho, P, Po, b, l, a, t, x, y, kf, Sglob;
double RhoBeg, RhoEnd, RhoStp, RhoMdl;
int n, NResist, NRho;
int type, nc, menu, cntrl, modein, k;
double *ArrR=0;
double *ArrP=0;
double *ArrRho=0;
double *ArrKf=0;
double *ArrB=0;
double *ArrL=0;
double *ArrA=0;
double *ArrT=0;
double *ArrX=0;
double *ArrY=0;
double *ArrS=0;
int *ArrType=0;
int *ArrN=0;
int *index;
double *ArrBuf;
// длявычислениекоэффициентаформыdouble KForm (double R, double rho);
// Ввод расчетных характеристик с контролем их спектра doublegetdata (constchar *partype, doublepardown, doubleparup);
// Вывод результатов расчета пленки voidOutResult(void);
// Вывод расчетных характеристик пленки voidOutParam(void);
// Освобождение памяти для массивов ArrB и ArrPvoidalloc1 (void);
// Выделение и освобождение памяти для других динамических массивов voidalloc2 (void);
int main()
{
int j;
cntrl=0;
double nbmax;
do
{
cout
<<»tM E N U n»<<endl
<<» [1] – VVOD PARAMETROV»<<endl
<<» [2] – RASCHET»<<endl
<<» [0] – VIHOD»
<<endl;
cin>>menu;
switch(menu)
{
case 1:
cout<<»nKolichestvo Resistirov N=»;
cin>>NResist;
// Выделение динамической памяти под массивы R и P
alloc1 ();
for (j=0; j<NResist; j++)
{
cout<<»nResistor»<<setw(2)<<j+1<<»:»;
ArrR[j]=getdata («nR(kOm) (0.05–10000)», Rdown, Rup);
ArrP[j]=getdata («P(mW) (5–50)», Pdown, Pup);
}
cout
<<»nMetod zadaniya Diapozona Rhonn»
<<» [1] – SPISOK Rho (rho1, rho2,…)«<<endl
<<» [2] – DIAPAZON Rho (rho_begin, rho_end, rho_step)«<<endl
<<endl;
cin>>modein;
switch(modein)
{
case 1: // Ввод числа частей в перечне сопротивлений пленки
cout<< «Razmer spiska NRho=»;
cin>>NRho;
break;
case 2: // Ввод спектра и шага конфигурации сопротивлений пленки
RhoBeg=getdata («RhoBeg», rhodown, rhoup);
RhoEnd=getdata («RhoEnd», rhodown, rhoup);
RhoStp=getdata («RhoStp», rhodown, rhoup);
NRho=(int) ((RhoEnd-RhoBeg)/RhoStp)+1;
rho=RhoBeg-RhoStp;
break;
}
alloc2 (); // Выделение динам. памяти под массив сопротивления пленки rho
for (j=0; j<NRho; j++)
{
// Ввод частей массива значений rho с данным шагом в спектре
if (modein==1) ArrRho[j]=getdata («rho», rhodown, rhoup);
if((modein==2) | (modein==3))
{
rho+=RhoStp;
ArrRho[j]=rho;
}
}
Po=getdata («Po (mW/mm2) (10–30)», Podown, Poup); // Вводзначенияудельноймощности Po
cntrl=1;
OutParam(); // Вывод исх. данных для зрительного контроля
break;
case 2: // Рассчет геометрических характеристик пленки
if(cntrl)
{ // Проверка наличия исх. данных
while (1==1)
{
cout<<»nNomer Resistora (1. «<<NResist<<») k=»;
cin>>k; k –;
if (k>=0 && k<NResist) break;
}
R=ArrR[k];
P=ArrP[k];
for (j=0; j<NRho; j++)
{
rho=ArrRho[j];
ParamR();
ArrType[j]=type;
ArrKf[j]=kf;
ArrB[j]=b;
ArrL[j]=l;
ArrA[j]=a;
ArrX[j]=x;
ArrY[j]=y;
ArrT[j]=t;
ArrN[j]=n;
ArrS[j]+=b*l;
}
nbmax=sort();
OutParam();
for (j=0; j<NRho; j++) ArrBuf[j]=ArrB[j];
nbmax=sort();
cout<<» MIN b=»<<ArrB [index[0]]<< «mm»<<endl;
cout<<» MAX b=»<<ArrB [index[NRho‑1]]<< «mm»<<endl<<endl;
for (j=0; j<NRho; j++) {
type=ArrType [index[j]];
rho=ArrRho [index[j]];
kf=ArrKf [index[j]];
b=ArrB [index[j]];
l=ArrL [index[j]];
a=ArrRho [index[j]];
x=ArrX [index[j]];
y=ArrX [index[j]];
t=ArrT [index[j]];
n=ArrN [index[j]];
OutResult();
}
cout<<endl;
}
else
cout<< «VVEDITE PARAMETRI»<<endl;
break;
case 0:
cout<<endl<<endl<<endl<< «Press ENTER to EXIT…»;
getch();
return 0;
}
}
while (1==1);
}
// Вычислениекоэффициентаформы
// Вывод: коэффициентформыdouble KForm (double R, double rho) {return R/rho;}
// Аргументы: числа x, y, z
// Вывод: макс {x, y, z}
double Max3 (double x, double y, double z) {return x>(z=y>z? y:z)? x:z;}
double Min3 (double x, double y, double z) {return x<(z=y<z? y:z)? x:z;}
{
kf=KForm (R, rho);
if (kf<0.1) type=0; // недопустимое
elseif (kf<1)
{ // прямоуголиная пленка при kf<1 (l<b) ф. (7) – (9), (2)
type=1;
double lD=(Dl+Db*kf)/gamma;
double lP=sqrt (R*P/rho/Po);
l=((int) (Max3 (lt, lD, lP)/h)+1)*h;
b=((int) (l/kf/h)+1)*h;
}
else
{ // прямоуголиная пленка при 1<=Kf<=10 (l>b) ф. (2) – (6)
double bD=(Db+Dl)/kf;
double bP=sqrt (rho*P/R/Po);
b=((int) (Max3 (bt, bD, bP)/h)+1)*h;
if (kf<=10)
{
type=2;
l=((int) (kf*b/h)+1)*h;
}
else
{ // пленка типа меандр при Kf>10 ф. (10) – (15)
type=3;
l=kf*b;
if (b<amin) a=0;
else a=b-amin;
nc=0;
do
{
nc++;
if (nc>10)
{
type=4;
break;
}
a+=amin;
t=a+b;
n=(int) sqrt (l/t);
x=n*t;
y=(l-a*n)/n;
}
while (y/a>10);
}
}
}
// Ввод начальных данных с проверкой допустимого их спектра значений
// Аргументы:
// строчка, содержащая заглавие параметра,
// нижняя граница допустимого значения,
// верхняя граница допустимого значения
// Выход: значениепараметраdouble getdata (const char *partype, double pardown, double parup)
{
double parval;
while (1==1)
parval>parup)
cout<< «non corect DIAPASON»<<endl;
elsebreak;
returnparval;
}
// Сортировка индекса массива по возрастанию способом пузырька
// Итог сортировки сохраняется в индексном массиве,
// элементы которого по порядку, начиная с младшего, содержат номера
// частей начального массива в порядке их возрастания, т.е.
// 1-ый(нулевой) элемент индексного массива содержит номер
// малого элемента начального массива, а крайний элемент индексного
// массива содержит номер наибольшего элемента начального массива
// На выход подается номер наибольшего элемента начального массива
int sort()
{
int j, jtmp;
int flag;
double btmp;
double *buf;
buf=new double[NRho];
for (j=0; j<NRho; j++)
{
index[j]=j;
buf[j]=ArrBuf[j];
}
do
{
flag=0;
for (j=1; j<NRho; j++)
if (buf[j‑1]>buf[j])
{
jtmp=index[j];
index[j]=index [j‑1];
index [j‑1]=jtmp;
btmp=buf[j];
buf[j]=buf [j‑1];
buf [j‑1]=btmp;
flag=1;
}
}
while(flag);
return index[NRho];
}
// Вывод введенных начальных данных для зрительного контроля
void OutParam()
{
int i, j;
cout<<endl;
for (i=0; i<NResist; i++)
{
cout
<<» R»<<i+1<< «=»<<ArrR[i]<< «kOm»
<<» P=»<<ArrP[i]<< «mW»
<<» Po=»<<Po<< «mW/mm2»;
if (modein==1)
{
cout<<» rho={»;
for (j=0; j<NRho‑1; j++)
cout<<ArrRho[j]<<»;»;
cout<<ArrRho [NRho‑1]<<») kOm»<<endl;
}
if((modein==2)|(modein==3))
cout
<<» rho=(«<<RhoBeg
<<»; «<<RhoBeg+RhoStp
<<». «<<RhoEnd<<») kOm/mm2»<<endl;
}
cout<<endl;
}
// Вывод результатов расчета пленочного резистора voidOutResult()
{
switch(type)
{
case 0: // Ошибка Kf<0.1
cout<<«ERROR «<< «Kform=»<<kf<<endl;
break;
case 1:
case 2: // прямоугольнаяпленка 0.1<=Kf<=10
cout<<setw(9)
<<» Rectangle»
<<setprecision(3)
<<» b=»<<setw(4)<<b<< «mm»
<<» l=»<<setw(4)<<l<< «mm»
<<» S=»<<setw(4)<<b*l<< «mm2»
<<» Kf=»<<setw(4)<<kf
<<»tRho=»<<setw(6)<<rho<< «kOm/mm2» //rho
<<endl;
break;
case 3:// пленка типа меандр Kf>10
cout<<setw(6)
<<» Meandr»
<<setprecision(3)
<<» b=»<<setw(4)<<b<< «mm»
<<» a=»<<setw(4)<<a<< «mm»
<<» t=»<<setw(4)<<t<< «mm»
<<» x=»<<setw(4)<<x<< «mm»
<<» y=»<<setw(4)<<y<< «mm»
<<» n=»<<setw(2)<<n
<<» Kf=»<<setw(4)<<kf
<<» Rho=»<<setw(5)<<rho
<<endl;
break;
case 4:
cout<<«ERROR «<< «nc=»<<nc<<endl;
break;
}
}
// Выделение памяти для динамических массивов значений
// сопротивления R и рассеиваемой мощности Pvoidalloc1 ()
{
if (ArrR!=NULL) delete ArrR;
if (ArrP!=NULL) delete ArrP;
ArrR=new double[NResist];
ArrP=new double[NResist];
}
// Выделение памяти для динамических массивов значений
// сопротивления пленки, коэффициентов формы и
// рассчитанных геометричесих характеристик пленочного резистора voidalloc2 ()
{
if (ArrRho!=NULL) delete ArrRho;
if (ArrKf!=NULL) delete ArrKf;
if (ArrB!=NULL) delete ArrB;
if (ArrL!=NULL) delete ArrL;
if (ArrA!=NULL) delete ArrA;
if (ArrX!=NULL) delete ArrX;
if (ArrY!=NULL) delete ArrY;
if (ArrT!=NULL) delete ArrT;
if (ArrN!=NULL) delete ArrN;
if (index!=NULL) delete index;
if (ArrBuf!=NULL) delete ArrBuf;
if (ArrType!=NULL) delete ArrType;
ArrRho=new double[NRho];
ArrKf=new double[NRho];
ArrB=new double[NRho];
ArrL=new double[NRho];
ArrA=new double[NRho];
ArrX=new double[NRho];
ArrY=new double[NRho];
ArrT=new double[NRho];
ArrN=new int[NRho];
ArrS=new double[NRho];
ArrType=new int[NRho];
index=new int[NRho];
ArrBuf=new double[NRho];
for (int j=0; j<NRho; j++) ArrS[j]=0;
}
Результаты тестирования программки
Блок-схема программки контроля вводимых данных
]]>